Hibernate學習系列————註解一對多雙向實例

環境和結構和上一章節同樣,不細述。。直接看代碼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();  }   }

相關文章
相關標籤/搜索