Hibernate的关联关系注解映射(一对一、一对多、多对一、多对多、自连接) 标签: hibernateentity 2016-10-11 16:28 1635人阅读 评论(0) 收藏 举报 分类

来源:互联网 发布:mac sdk 环境变量配置 编辑:程序博客网 时间:2024/05/19 02:44

hibernate注解的关联关系映射,分为2种,即单向关联映射和双向关联映射,它们最大的区别就是在查询数据时,单向关联只能通过一边进行查询,而双向关联两边都可以进行查询。

单向关联是指只在一方加上注解,

双向关联是指双方都加上注解。这里主要记录双向关联。


1.  一对一关联:

如有2张表,公民表Person和身份证表IdCard

一方(IdCard):

@OneToOne(fetch=FetchType.LAZY,//延迟加载
targetEntity=IdCards.class,//目标对象
mappedBy="person",//指定由哪边维护关系(在这指有Person表维护,‘person’指IdCards标中关联的Person对象
cascade=CascadeType.ALL)

另一方(Person):

@OneToOne(fetch=FetchType.LAZY,
targetEntity=Person.class)//维护关系表
@JoinColumn(name="personId",referencedColumnName="personId",unique=true)

具体如下:

[java] view plain copy
 print?
  1. @Entity  
  2. @Table(name = "tb_person")  
  3. public class Person implements Serializable {  
  4.   
  5.     private static final long serialVersionUID = 576770011136181361L;  
  6.   
  7.     @Id  
  8.     @GeneratedValue(strategy = GenerationType.AUTO)  
  9.     private Long personId;  
[java] view plain copy
 print?
  1. <span style="white-space:pre">  </span>@OneToOne(fetch=FetchType.LAZY,targetEntity=IdCards.class,mappedBy="person",cascade=CascadeType.ALL)  
[java] view plain copy
 print?
  1. <span style="white-space:pre">  </span>private IdCard idcard;  
[java] view plain copy
 print?
  1.   
[java] view plain copy
 print?
  1. @Entity  
  2. @Table(name = "tb_idcard")  
  3. public class Idcard implements Serializable {  
  4.   
  5.     private static final long serialVersionUID = 576770011136181369L;  
  6.   
  7.     @Id  
  8.     @GeneratedValue(strategy = GenerationType.AUTO)  
  9.     private Long idcardId;  
[java] view plain copy
 print?
  1. <span style="white-space:pre">  </span>@OneToOne(fetch=FetchType.LAZY,  
  2. <span style="white-space:pre">  </span>targetEntity=Person.class)  
  3. <span style="white-space:pre">  </span>@JoinColumn(name="personId",referencedColumnName="personId",unique=true)  
[java] view plain copy
 print?
  1. <span style="white-space:pre">  </span>private Person person;  

2. 一对多关系:

       一方:

@OneToMany(fetch=FetchType.LAZY,

targetEntity=User.class,

cascade=CascadeType.ALL,

orphanRemoval=true,//孤儿删除

mappedBy="department")

[java] view plain copy
 print?
  1. cascade=CascadeType.ALL,,即交由多的一方控制;  
多方:

            @ManyToOne(fetch = FetchType.LAZY,targetEntity = Department.class)@JoinColumn(name = "departmentId",referencedColumnName="departmentId")
[java] view plain copy
 print?
  1. <span style="white-space:pre">  </span>如:一个用户只能属于一个部门,一个部门里可以有很多用户,其注解如下,  
[java] view plain copy
 print?
  1. 部门实体类:  
  2. @Entity  
  3. @Table(name = "tb_department")  
  4. public class Department implements Serializable {  
  5.   
  6.     private static final long serialVersionUID = -3489189232910430049L;  
  7.   
  8.     @Id  
  9.     @GeneratedValue(strategy = GenerationType.AUTO)  
  10.     private Long departmentId;  
  11.   
  12.     private String name;  
  13.   
  14.     private String description;  
[java] view plain copy
 print?
  1. <span style="white-space:pre">  </span>@OneToMany(fetch=FetchType.LAZY,targetEntity=User.class,cascade=CascadeType.ALL,orphanRemoval=true,mappedBy="department")  
  2. <span style="white-space:pre">  </span>private Set<User> users;  
  3.        ........  
  4. }  
[java] view plain copy
 print?
  1. 用户实体类:  
  2. @Entity  
  3. @Table(name="tb_user")  
  4. public class User implements Serializable {  
  5.   
  6.     private static final long serialVersionUID = 576770011136181361L;  
  7.   
  8.     @Id  
  9.     @GeneratedValue(strategy=GenerationType.AUTO)  
  10.     private Long userId;  
  11.   
  12.    <span style="white-space:pre"> </span>@ManyToOne(fetch = FetchType.LAZY,targetEntity = Department.class)  
  13. <span style="white-space:pre">  </span>@JoinColumn(name = "departmentId",referencedColumnName="departmentId")  
  14. <span style="white-space:pre">  </span>private Department department;  
  15.   
  16.     private String loginName;  
  17.       ........  
  18.        ........  
}

2. 多对多关系:

          多方:

@ManyToMany(fetch=FetchType.LAZY,targetEntity=Role.class)@JoinTable(name = "tb_user_role", joinColumns = @JoinColumn(name = "userId",referencedColumnName="userId") , inverseJoinColumns = @JoinColumn(name = "roleId",referencedColumnName="roleId"))

其中“tb_user_role”是两者的关系表,由两者的主键ID组成。通过@JoinColumn(name = "userId")指定在关系表中的字段名。

另一个多方:

@ManyToMany(fetch = FetchType.LAZY, targetEntity = User.class, cascade = CascadeType.ALL, mappedBy = "roles")

[java] view plain copy
 print?
  1. joinColumns :指主表,inverseJoinColumns :指匹配表  
即user-->role,则user是主表,role是匹配表

如:一个用户可以有多个角色,一个角色可以适用于多个用户。

[java] view plain copy
 print?
  1. 用户实体类:  
  2.   
  3. @Entity  
  4. @Table(name="tb_user")  
  5. public class User implements Serializable {  
  6.   
  7.     private static final long serialVersionUID = 576770011136181361L;  
  8.   
  9.     @Id  
  10.     @GeneratedValue(strategy=GenerationType.AUTO)  
  11.     private Long userId;  
  12.   
  13.     private String loginName;  
  14.   
  15.     private String name;  
  16.   
  17.     private String gender;  
  18.   
  19.     private String phone;  
  20.   
  21.     private String email;  
  22.   
  23.     private String description;  
  24.       
  25.     @ManyToMany(fetch=FetchType.LAZY,targetEntity=Role.class)  
[java] view plain copy
 print?
  1. <span style="white-space:pre">  </span>@JoinTable(name = "tb_user_role", joinColumns = @JoinColumn(name = "userId",referencedColumnName="userId") ,   
[java] view plain copy
 print?
  1. <span style="white-space:pre">  </span>inverseJoinColumns = @JoinColumn(name = "roleId",referencedColumnName="roleId"))  
  2. <span style="white-space:pre">  </span>private Set<Role> roles = new HashSet<Role>();       
[java] view plain copy
 print?
  1. .....  

[java] view plain copy
 print?
  1. 角色实体类:   
  2.   
  3. @Entity  
  4. @Table(name = "tb_role")  
  5. public class Role implements Serializable {  
  6.   
  7.     private static final long serialVersionUID = -7625883839295666830L;  
  8.   
  9.     @Id  
  10.     @GeneratedValue(strategy = GenerationType.AUTO)  
  11.     private Long roleId;  
  12.   
  13.     private String name;  
  14.   
  15.     private String description;  
  16.   
  17.     @ManyToMany(fetch = FetchType.LAZY, targetEntity = User.class, cascade = CascadeType.ALL, mappedBy = "roles")  
  18. <span style="white-space:pre">  </span>private Set<User> users = new HashSet<User>();  
  19.         .....  
  20.         .....  
  21. }  

2. 自连接关系:

自连接一方:

@ManyToOne(fetch = FetchType.LAZY, targetEntity = Department.class)
@JoinColumn(name = "parentId",referencedColumnName="departmentId")

自连接多方:

@OneToMany(fetch=FetchType.LAZY,targetEntity=Department.class,cascade=CascadeType.ALL,orphanRemoval=true,mappedBy="parent")
@OrderBy("departmentId ASC")

     因为是自连接,在一个表里操作,表中要增加一个父类id,用户建立连接。

   如:部门管理,一个部门可以有很多个下级部门,但是一个上级部门只能有一个上级部门,这时需要建立自连接。

[java] view plain copy
 print?
  1. 部门实体类::  
  2.   
  3. @Entity  
  4. @Table(name = "tb_department")  
  5. public class Department implements Serializable {  
  6.   
  7.     private static final long serialVersionUID = -3489189232910430049L;  
  8.   
  9.     @Id  
  10.     @GeneratedValue(strategy = GenerationType.AUTO)  
  11.     private Long departmentId;  
  12.   
  13.     private String name;  
  14.   
  15.     private String description;  
  16.          
  17. <span style="white-space:pre">  </span>@ManyToOne(fetch = FetchType.LAZY, targetEntity = Department.class)  
  18. <span style="white-space:pre">  </span>@JoinColumn(name = "parentId",referencedColumnName="departmentId")  
  19. <span style="white-space:pre">  </span>private Department parent;  
  20.   
  21.   
  22. <span style="white-space:pre">  </span>@OneToMany(fetch=FetchType.LAZY,targetEntity=Department.class,cascade=CascadeType.ALL,orphanRemoval=true,mappedBy="parent")  
  23. <span style="white-space:pre">  </span>@OrderBy("departmentId ASC")  
  24. <span style="white-space:pre">  </span>private Set<Department> children = new HashSet<Department>();  
[java] view plain copy
 print?
  1. <span style="white-space:pre">  </span>....  
  2.         .....  
阅读全文
0 0
原创粉丝点击