@Entity public class User{ private Address address; @OneToOne public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } } @Entity public class Address{ private User user; @OneToOne(mappedBy = "address") public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
1、两边都定义了@OneToOne,但都没有定义mappedBy,则user和address表都会生成到对方的外键,双方都是这个关系的拥有者。
2、两边都定义了@OneToOne,如果user定义了mappedBy,则在address表生成到user的外键,address是这个关系的拥有者;如果address定义了mappedBy,则在user表生成到address的外键,user是这个关系的拥有者。
二、@ManyToOne和@OneToMany
@Entity public class Employee { private Department department; @ManyToOne public Department getDepartment() { return department; } public void setDepartment(Department department) { this.department = department; } } @Entity public class Department { private Setemployees = new HashSet (); @OneToMany(mappedBy="department") public Collection getEmployees() { return employees; } public void setEmployees(Collection employees) { this.employees = employees; } }
@ManyToOne中Many指的是本类(也就是声明@ManeyToOne的类),One是指关联类,也就是To前边的对应本类,后边的对应关联类。如果方法返回的是单数关联类则定义@ManyToOne,例如:
@ManyToOne public Department getDepartment() { return department; }
方法返回的是Department,为单数关联类,对应@ManyToOne中的One;
如果返回的是复数关联类则定义@OneToMany,例如:
@OneToMany(mappedBy="department") public CollectiongetEmployees() { return employees; }
方法返回的是Collection
三、@ManyToMany
@Entity public class Book { private Set authors = new HashSet(); @ManyToMany public Set getAuthors(){ return authors; } Public void setAuthors(Set authors){ This.authors = authors; } } @Entity public class Author { private Set books = new HashSet (); @ManyToMany(mappedBy="authors") public Set getBooks(){ return books; } Public void setBooks(Set books){ This.books = books; } }
@ManyToMany会生成中间表,具体表名和字段可以通过@AssociationTable来定义,默认的就可以了,同样关系的非拥有者,需要定义mappedBy属性。