環境和結構和上一章節同樣,不細述。。直接看代碼java
實例條件:Person 和 Address ,一我的用於多個房子,人能夠改變房子,房子也能夠變更人sql
Person類:session
package cn.dao;app
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;fetch
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;this
@Entity
@Table(name = "person")
public class Person implements Serializable{
private Long id;
private String name;
private String defaultAddress;
private Set<Address> as = new HashSet<Address>();.net
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long getId() {
return id;
}hibernate
public void setId(Long id) {
this.id = id;
}get
@Column(name = "name")
public String getName() {
return name;
}it
public void setName(String name) {
this.name = name;
}
@Column(name = "defaultAddress")
public String getDefaultAddress() {
return defaultAddress;
}
public void setDefaultAddress(String defaultAddress) {
this.defaultAddress = defaultAddress;
}
@OneToMany (fetch = FetchType.LAZY,cascade = { CascadeType.ALL },mappedBy = "person")
public Set<Address> getAs() {
return as;
}
public void setAs(Set<Address> as) {
this.as = as;
}
}
Address類:
package cn.dao;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import com.sun.istack.internal.NotNull;
@Entity
@Table(name = "address")
public class Address implements Serializable{
private Long id;
private String name;
private Person person;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name = "name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ManyToOne
@NotNull
@JoinColumn(name = "personId")
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
}
主類:OneToManyDouble:
package cn.test;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import cn.dao.Address;
import cn.dao.Person;
import cn.utils.HibernateUtil;
/** * 一對多的雙向關聯 * @author hasee * */ public class OneToManyDouble { public static void main(String[] args){ editFromAddress(); } public static void save(){ Session session = HibernateUtil.getSession(); org.hibernate.Transaction transaction = session.beginTransaction(); Person person = new Person(); person.setName("Lucy"); person.setDefaultAddress("BeiJing");//默認地址 Set<Address> as = new HashSet<Address>();//旗下有許多房子 Address addressOne = new Address(); addressOne.setName("ShangHai"); addressOne.setPerson(person); as.add(addressOne); Address addressTwo = new Address(); addressTwo.setName("ShenZhen"); addressTwo.setPerson(person); as.add(addressTwo); person.setAs(as); session.save(person); transaction.commit(); HibernateUtil.closeSession(); } public static void delete(){ Session session = HibernateUtil.getSession(); Transaction transaction = session.beginTransaction(); //刪除一我的的同時刪除其關聯的住址 Person person = (Person) session.get(Person.class, 5L); session.delete(person); transaction.commit(); //後臺打印查看sql語句發現效率很低,能夠直接根據ID刪除Address表的信息,沒必要關聯查詢 HibernateUtil.closeSession(); } public static void edit(){ Session session = HibernateUtil.getSession(); Transaction transaction = session.beginTransaction(); //根據ID獲取到人的信息,修改Address表的住址 Person person = (Person) session.get(Person.class, 6L); Set<Address> as = person.getAs(); for (Address address : as) { if(address.getName().equals("ShangHai")){ address.setName("ShangHai_change"); } } session.update(person); transaction.commit(); HibernateUtil.closeSession(); } //根據Address操做Person表 public static void saveFromAddress(){ Session session = HibernateUtil.getSession(); Transaction transaction = session.beginTransaction(); Address address = new Address(); address.setName("newCity"); Person person = (Person) session.get(Person.class, 6L);//新的住址屬於已經存在的一我的的(也能夠新建一個Person) address.setPerson(person); session.save(address);//這裏是保存Person仍是Address呢?----> 結果是:Address <----- transaction.commit(); HibernateUtil.closeSession(); } public static void deleteFromAddress(){ Session session = HibernateUtil.getSession(); Transaction transaction = session.beginTransaction(); Address address = (Address) session.get(Address.class, 12L); session.delete(address);//對Person是沒什麼影響的 transaction.commit(); HibernateUtil.closeSession(); } public static void editFromAddress(){ Session session = HibernateUtil.getSession(); Transaction transaction = session.beginTransaction(); Address address = (Address) session.get(Address.class, 13L); Person person = address.getPerson(); person.setName("Mike");//直接修改掉主人 session.update(address); transaction.commit(); HibernateUtil.closeSession(); } }