Hibernate annotation 的各种关系

来源:互联网 发布:怎样申请网络直播平台 编辑:程序博客网 时间:2024/06/05 11:29

转的:

 

一、@OneToOne

Java代码  收藏代码
  1. @Entity  
  2. public class User{  
  3.     private Address address;  
  4.   
  5.     @OneToOne  
  6.     public Address getAddress() {  
  7.         return address;  
  8.     }  
  9.   
  10.     public void setAddress(Address address) {  
  11.         this.address = address;  
  12.     }  
  13. }  
  14.   
  15. @Entity  
  16. public class Address{  
  17.     private User user;  
  18.   
  19.     @OneToOne(mappedBy = "address")  
  20.     public User getUser() {  
  21.         return user;  
  22.     }  
  23.   
  24.     public void setUser(User user) {  
  25.         this.user = user;  
  26.     }  
  27.   
  28. }  


1、两边都定义了@OneToOne,但都没有定义mappedBy,则user和address表都会生成到对方的外键,双方都是这个关系的拥有者。 
2、两边都定义了@OneToOne,如果user定义了mappedBy,则在address表生成到user的外键,address是这个关系的拥有者;如果address定义了mappedBy,则在user表生成到address的外键,user是这个关系的拥有者。 
二、@ManyToOne和@OneToMany 


Java代码  收藏代码
  1. @Entity  
  2. public class Employee {  
  3. private Department department;  
  4.   
  5. @ManyToOne  
  6. public Department getDepartment() {  
  7. return department;  
  8. }  
  9.   
  10. public void setDepartment(Department department) {  
  11. this.department = department;  
  12. }  
  13. }  
  14.   
  15. @Entity  
  16. public class Department {  
  17. private Set<Employee> employees = new HashSet<Employee>();  
  18.   
  19. @OneToMany(mappedBy="department")  
  20. public Collection<Employee> getEmployees() {  
  21. return employees;  
  22. }  
  23. public void setEmployees(Collection<Employee> employees) {  
  24. this.employees = employees;  
  25. }  
  26. }  

 

如果只写了@manytoone,不写其他配置,那么,会生成3张表,其中一张为关系表(默认为多对多)

所以最好是加上@JoinColumn(name="**id")


@ManyToOne中Many指的是本类(也就是声明@ManeyToOne的类),One是指关联类,也就是To前边的对应本类,后边的对应关联类。如果方法返回的是单数关联类则定义@ManyToOne,例如: 

Java代码  收藏代码
  1. @ManyToOne  
  2. public Department getDepartment() {  
  3. return department;  
  4. }  

方法返回的是Department,为单数关联类,对应@ManyToOne中的One; 
如果返回的是复数关联类则定义@OneToMany,例如: 
Java代码  收藏代码
  1. @OneToMany(mappedBy="department")  
  2. public Collection<Employee> getEmployees() {  
  3. return employees;  
  4. }  

方法返回的是Collection<Employee>,复数关联类,对应@OneToMany中的Many。其中定义mappedBy的是@OneToMany,也就是说One这一方是关系的拥有者。Many一方的表中生成到关联类的外键。 

三、@ManyToMany 

Java代码  收藏代码
  1. @Entity  
  2. public class Book {  
  3. private Set authors = new HashSet<Author>();  
  4.   
  5. @ManyToMany  
  6. public Set<Author> getAuthors(){  
  7. return authors;  
  8. }  
  9.       
  10. Public void setAuthors(Set<Author> authors){  
  11.    This.authors = authors;  
  12. }  
  13. }  
  14.   
  15. @Entity  
  16. public class Author {  
  17. private Set books = new HashSet<Book>();  
  18.   
  19.   
  20. @ManyToMany(mappedBy="authors")  
  21. public Set<Book> getBooks(){  
  22. return books;  
  23. }  
  24.   
  25. Public void setBooks(Set<Book> books){  
  26.    This.books = books;  
  27. }  
  28. }  

@ManyToMany会生成中间表,具体表名和字段可以通过@AssociationTable来定义,默认的就可以了,同样关系的非拥有者,需要定义mappedBy属性。 

阅读全文
0 0