您的位置:首页 > 编程语言 > Java开发

Hibernate4关系映射总结

2016-06-11 15:23 447 查看
--------------------------------------------无表关联双向1-N--------------------------------------------

User 1少的一端,Order N多的一端

--------User实体类
@Id
@Column(name="id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
private String username;
private String password;
private String email;
private Integer sex;
//mappedBy="person"属性表明该Person实体不控制关联关系

    @OneToMany(targetEntity=Order.class,mappedBy="user") //定义user实体关联的Order实体
private Set<Order> orders = new HashSet<>();

---------Order实体类
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String orderName;
private String ctimes;
//定义Order实体关联的User实体
@ManyToOne(targetEntity=User.class)
@JoinColumn(name="user_id",referencedColumnName="id",nullable=false)
@Cascade(CascadeType.ALL) //级联策略 所有持久化都级联到关联的实体 总有级联操作都在order控制
private User user;

-------------------------------------无表关联的单项N-1-----------------------------------------------

---------User实体类
@Id
@Column(name="id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
private String username;
private String password;
private String email;
private Integer sex;

---------Order实体类
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String orderName;
private String ctimes;
@ManyToOne(targetEntity=User.class) //定义order实体关联的user实体
@JoinColumn(name="user_id",nullable=false) //映射外键关联。指定外键列的列名是user_id
@Cascade(CascadeType.ALL) //级联策略 所有持久化都级联到关联的实体(级联关系控制在Order) 执行的sql语句或最后出现 update user 查看user实体是否存在
private User user;

-------------------------------------有表关联的单项N-1-----------------------------------------------产生中间表(order_user)连接user和order

---------User实体类
@Id
@Column(name="id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
private String username;
private String password;
private String email;
private Integer sex;

---------Order实体类
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String orderName;
private String ctimes;

@ManyToOne(targetEntity=User.class) //定义Order实体关联的User实体

    @JoinTable(name="order_user",//指定连接表的表名为order_user(连接表指的是中间表)

    //指定连接表中的order_id为外键(存在于中间表),参照到实体对应表的主键列 (id是t_order表的主键列)

    joinColumns=@JoinColumn(name="order_id",referencedColumnName="id",unique=true),

    //指定连接表中的user_id外键列(存在于中间表),参照到当前实体的关联实体对应表的主键列(id是t_user表的主键列)

    inverseJoinColumns=@JoinColumn(name="user_id",referencedColumnName="id"))
private User user;

-------------------------------------(无连接表的单项1-N关联)-----------------------------------------------

无连接表的单项1-N关联,因为1的一端需要访问N的一端,而且N的一端将以集合Set形式表示

 * 程序是需要在N的一端增加一个外键列来维护关系,因为是由1的一端来控制关联关系,因此直接在1的一端用@JoinColumn修饰Set集合映射外键列即可

---------User实体类
@Id
@Column(name="id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
private String username;
private String password;
private String email;
private Integer sex;

/*
*  1、FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载。
2、FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载。
* */
@OneToMany(targetEntity=Order.class,fetch=FetchType.EAGER) //定义User实体关联的Order实体
@JoinColumn(name="user_id",referencedColumnName="id") //映射外键关联。指定外键列的列名是user_id
private Set<Order> order;

---------Order实体类
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String orderName;
private String ctimes;

----------test

4000
User user =
new User();
    user.setUsername("dt");
user.setPassword("123");
    user.setEmail("dskdks@qq.com");
    user.setSex(2);
userService.saveUser(user);
 

Order order = new Order();
order.setCtimes("2016-06-11");
order.setOrderName("商品3");
orderService.saveOrder(order);

-------------------------------------无连接表的双向项1-N关联-----------------------------------------------

---------User实体类

@Id
@Column(name="id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
private String username;
private String password;
private String email;
private Integer sex;

/*
*  1、FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载。
2、FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载。
* */
@OneToMany(targetEntity=Order.class,mappedBy="user",cascade = {CascadeType.PERSIST, CascadeType.MERGE},fetch=FetchType.EAGER) //定义User实体关联的Order实体
private Set<Order> order= new HashSet<>();

---------Order实体类
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String orderName;
private String ctimes;
@ManyToOne(targetEntity=User.class)
@JoinColumn(name="user_id", referencedColumnName="id", nullable=false)
private User user;

---------test
     User user =new User();
    user.setUsername("ee");
    user.setPassword("123");
    user.setEmail("dskdks@qq.com");
    user.setSex(2);
userService.saveUser(user);
 

Order order = new Order();
order.setCtimes("2016-06-11");
order.setOrderName("商品21");
order.setUser(user);
orderService.saveOrder(order);

Order order2 = new Order();
order2.setCtimes("2016-06-11");
order2.setOrderName("商品21");
order2.setUser(user);
orderService.saveOrder(order2);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hibernate spring java