通常為了實(shí)現(xiàn)entity class的雙向association,每添加一組實(shí)例在java中需要兩行代碼:
persion.getAddresses().add(address);
address.getPersons().add(person);
但對Hibernate而已,上面的代碼會被轉(zhuǎn)化為兩條insert語句,
為了避免這樣的情況出現(xiàn)需要定義inverse屬性,告訴Hibernate persion和address之間的關(guān)系:
// !file: Person.class public class Person { // ... @ManyToMany( targetEntity= Address.class, cascade = CascadeType.ALL, ) @JoinTable( name="persion_address", joinColumns= {@JoinColumn(name="person_id")}, inverseJoinColumns= {@JoinColumn(name="address_id")} ) private Set<Address> adressses = new HashSet<Address> (0); // ... }
// !file: Address.class public class Address { // ... @ManyToMany( targetEntity= Persion.class, cascade = CascadeType.ALL, mappedBy = "addresses" ) private Set<Person> persons = new HashSet<Person>(); // ... }
上面的兩個(gè)annotation告訴Hibernate,Person是主,對Address中persons屬性的修改將不會產(chǎn)生SQL語句。
Hibernate里,如果是Many-to-many的關(guān)系,可以任意設(shè)置主class。
通常,還可以將添加刪除關(guān)系的代碼包裝起來:
// !file: Person.class public class Person { // ... public void addAddress(Address address) { this.getAddresses().add(address); address.getPersons().add(this); } public void removeAddress(Address address) { this.getAddresses().remove(address); address.getPersons().remove(this); } //... }