hibernate annotation 之mappedBy 与 @JoinColumn区别

来源:互联网 发布:老九门里面的软件 编辑:程序博客网 时间:2024/06/05 18:28

1.一对多的映射(one-to-many)

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. @Entity  
  2. @Table(name="t_classroom")  
  3. public class ClassRoom  
  4. {  
  5.     private int id;  
  6.     private String className;  
  7.     private Set<Student> students;  
  8.    
  9.     @OneToMany(mappedBy="room")    
  10.     --->OneToMany指定了一对多的关系,mappedBy="room"指定了由多的那一方来维护关联关系,mappedBy指的是多的一方对一的这一方的依赖的属性,  
  11.     (注意:如果没有指定由谁来维护关联关系,则系统会给我们创建一张中间表)  
  12.     @LazyCollection(LazyCollectionOption.EXTRA)    
  13.     --->LazyCollection属性设置成EXTRA指定了当如果查询数据的个数时候,只会发出一条 count(*)的语句,提高性能  
  14.     public Set<Student> getStudents()  
  15.     {  
  16.         return students;  
  17.     }  
  18.      
  19. }  
  20.   
  21. @Entity  
  22. @Table(name="t_student")  
  23. public class Student  
  24. {  
  25.     private int id;  
  26.     private String name;  
  27.     private int age;  
  28.     private ClassRoom room;  
  29.       
  30.     @ManyToOne(fetch=FetchType.LAZY)    
  31.     ---> ManyToOne指定了多对一的关系,fetch=FetchType.LAZY属性表示在多的那一方通过延迟加载的方式加载对象(默认不是延迟加载)  
  32.     @JoinColumn(name="rid")    
  33.     --->通过 JoinColumn 的name属性指定了外键的名称 rid (注意:如果我们不通过JoinColum来指定外键的名称,系统会给我们声明一个名称)  
  34.     public ClassRoom getRoom()  
  35.     {  
  36.         return room;  
  37.     }  
  38.      
  39. }  

在判断到底是谁维护关联关系时,可以通过查看外键,哪个实体类定义了外键,哪个类就负责维护关联关系。

2.一对一映射(One-to-One)

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. @Entity  
  2. @Table(name="t_person")  
  3. public class Person  
  4. {  
  5.     private int id;  
  6.     private String name;  
  7.     private IDCard card;  
  8.       
  9.     @OneToOne(mappedBy="person")    
  10.     --->指定了OneToOne的关联关系,mappedBy同样指定由对方来进行维护关联关系  
  11.     public IDCard getCard()  
  12.     {  
  13.         return card;  
  14.     }  
  15. }  
  16.   
  17. @Entity  
  18. @Table(name="t_id_card")  
  19. public class IDCard  
  20. {  
  21.     private int id;  
  22.     private String no;  
  23.     private Person person;  
  24.     
  25.     @OneToOne    
  26.     --->OnetoOne指定了一对一的关联关系,一对一中随便指定一方来维护映射关系,这里选择IDCard来进行维护  
  27.     @JoinColumn(name="pid")    
  28.     --->指定外键的名字 pid  
  29.     public Person getPerson()  
  30.     {  
  31.         return person;  
  32.     }     
  33. }  

3.Many-to-Many映射(多对多映射关系)

3.1通过中间表由任一一个多的一方来维护关联关系

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. @Entity  
  2. @Table(name="t_teacher")  
  3. public class Teacher  
  4. {  
  5.     private int id;  
  6.     private String name;  
  7.     private Set<Course> courses;  
  8.        
  9.     @ManyToMany(mappedBy="teachers")    
  10.     --->表示由Course那一方来进行维护  
  11.     public Set<Course> getCourses()  
  12.     {  
  13.         return courses;  
  14.     }      
  15. }  
  16.   
  17. @Entity  
  18. @Table(name="t_course")  
  19. public class Course  
  20. {  
  21.     private int id;  
  22.     private String name;  
  23.     private Set<Teacher> teachers;  
  24.         
  25.     @ManyToMany   ---> ManyToMany指定多对多的关联关系  
  26.     @JoinTable(name="t_teacher_course", joinColumns={ @JoinColumn(name="cid")}, inverseJoinColumns={ @JoinColumn(name = "tid") })    
  27.     --->因为多对多之间会通过一张中间表来维护两表直接的关系,所以通过 JoinTable 这个注解来声明,name就是指定了中间表的名字,  
  28.     JoinColumns是一个 @JoinColumn类型的数组,表示的是我这方在对方中的外键名称,我方是Course,所以在对方外键的名称就是 rid,  
  29.     inverseJoinColumns也是一个 @JoinColumn类型的数组,表示的是对方在我这放中的外键名称,对方是Teacher,所以在我方外键的名称就是 tid  
  30.     public Set<Teacher> getTeachers()  
  31.     {  
  32.         return teachers;  
  33.     }  
  34. }  

3.2 将Many-to-Many拆分成两个One-to-Many的映射(Admin、Role、AdminRole)

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. @Entity  
  2. @Table(name="t_admin")  
  3. public class Admin  
  4. {  
  5.     private int id;  
  6.     private String name;  
  7.     private Set<AdminRole> ars;  
  8.      
  9.     public Admin()  
  10.     {  
  11.         ars = new HashSet<AdminRole>();  
  12.     }  
  13.     public void add(AdminRole ar)  
  14.     {  
  15.         ars.add(ar);  
  16.     }  
  17.     
  18.     @OneToMany(mappedBy="admin")    
  19.     --->OneToMany关联到了AdminRole这个类,由AdminRole这个类来维护多对一的关系,mappedBy="admin"  
  20.     @LazyCollection(LazyCollectionOption.EXTRA)    
  21.     public Set<AdminRole> getArs()  
  22.     {  
  23.         return ars;  
  24.     }   
  25. }  
  26.   
  27. @Entity  
  28. @Table(name="t_role")  
  29. public class Role  
  30. {  
  31.     private int id;  
  32.     private String name;  
  33.     private Set<AdminRole> ars;  
  34.   
  35.     public Role()  
  36.     {  
  37.         ars = new HashSet<AdminRole>();  
  38.     }  
  39.     public void add(AdminRole ar)  
  40.     {  
  41.         ars.add(ar);  
  42.     }  
  43.      
  44.     @OneToMany(mappedBy="role")    
  45.     --->OneToMany指定了由AdminRole这个类来维护多对一的关联关系,mappedBy="role"  
  46.     @LazyCollection(LazyCollectionOption.EXTRA)  
  47.     public Set<AdminRole> getArs()  
  48.     {  
  49.         return ars;  
  50.     }   
  51. }  
  52.   
  53.   
  54. @Entity  
  55. @Table(name="t_admin_role")  
  56. public class AdminRole  
  57. {  
  58.     private int id;  
  59.     private String name;  
  60.     private Admin admin;  
  61.     private Role role;  
  62.      
  63.     @ManyToOne  --->  ManyToOne关联到Admin  
  64.     @JoinColumn(name="aid")    
  65.     public Admin getAdmin()  
  66.     {  
  67.         return admin;  
  68.     }  
  69.      
  70.     @ManyToOne  --->    
  71.     @JoinColumn(name="rid")  
  72.     public Role getRole()  
  73.     {  
  74.         return role;  
  75.     }   
  76. }  

通过hibernate来进行插入操作的时候,不管是一对多、一对一还是多对多,都只需要记住一点,在哪个实体类声明了外键,就由哪个类来维护关系,

在保存数据时,总是先保存的是没有维护关联关系的那一方的数据,后保存维护了关联关系的那一方的数据,如:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. Person p = new Person();  
  2. p.setName("xiaoluo");  
  3. session.save(p);  
  4.               
  5. IDCard card = new IDCard();  
  6. card.setNo("1111111111");  
  7. card.setPerson(p);  
  8. session.save(card);  
0 0
原创粉丝点击