hibernate基於外鍵的雙向1-1關係映射

對於雙向1-1關聯而言,兩端都需要使用@OneToOne註解進行關聯,好了廢話不多說直接上例子

1、首先創建數據庫數據庫採用sql sever 2008 r2 

創建person表

創建address表

進行主外鍵關係的添加

2、用hibernate反向工程生成他們的實體類

person的實體類

package com.wxb.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.OneToOne;

import static javax.persistence.GenerationType.IDENTITY;

import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

/**
 * PersonInf entity.
 * 
 * @author 王校兵
 * @version 1.0, 2015-11-27
 */
@Entity
@Table(name = "person_inf")
public class PersonInf implements java.io.Serializable {

	private Integer personId;
	private Integer age;
	private String name;
	private AddressInf addressInf;

	@Id
	@GeneratedValue(strategy = IDENTITY)
	@Column(name = "person_id")
	public Integer getPersonId() {
		return this.personId;
	}

	public Integer getAge() {
		return this.age;
	}

	public String getName() {
		return this.name;
	}

	@OneToOne(mappedBy = "personInf")
	@Cascade(CascadeType.ALL)
	public AddressInf getAddressInf() {
		return this.addressInf;
	}

	public void setAddressInf(AddressInf addressInf) {
		this.addressInf = addressInf;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void setPersonId(Integer personId) {
		this.personId = personId;
	}

}
address的實體類

package com.wxb.model;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;

import static javax.persistence.GenerationType.IDENTITY;

import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

/**
 * PersonInf entity.
 * 
 * @author 王校兵
 * @version 1.0, 2015-11-27
 */
@Entity
@Table(name = "address_inf")
public class AddressInf implements java.io.Serializable {

	private Integer addressId;
	private String addressDetial;
	private PersonInf personInf;

	public AddressInf(String addressDetial) {
		this.addressDetial = addressDetial;
	}

	@Id
	@GeneratedValue(strategy = IDENTITY)
	@Column(name="address_id")
	public Integer getAddressId() {
		return this.addressId;
	}

	public AddressInf() {
		super();
	}

	public String getAddressDetial() {
		return this.addressDetial;
	}

	@OneToOne(targetEntity = PersonInf.class)
	@JoinColumn(name = "address_id", unique = true)
	@Cascade(CascadeType.ALL)
	public PersonInf getPersonInf() {
		return personInf;
	}

	public void setAddressDetial(String addressDetial) {
		this.addressDetial = addressDetial;
	}

	public void setAddressId(Integer addressId) {
		this.addressId = addressId;
	}

	public void setPersonInf(PersonInf personInf) {
		this.personInf = personInf;
	}

}
3、創建他們的測試類
<span style="white-space:pre">	</span><pre name="code" class="java">package com.wxb.dao;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.wxb.model.AddressInf;
import com.wxb.model.PersonInf;
import com.wxb.util.HibernateSessionFactory;
/**
 * 雙向一對一關聯映射測試類
 * @author 王校兵
 * @version 1.0, 2015-11-27
 * */
public class BothOneToOneDao {
	public static void main(String[] args) {
		Session session = HibernateSessionFactory.getSession();
		Transaction ts = session.beginTransaction();
		
		PersonInf p = (PersonInf) session.get(PersonInf.class, 20);
		
		System.out.println(p.getAddressInf().getAddressDetial());
		
		AddressInf a = (AddressInf) session.get(AddressInf.class, 20);
		
		System.out.println(a.getPersonInf().getName());
		
		ts.commit();
	}
}

通過這些步驟的配置就可以實現雙向一對一的映射;

小小的總結一些要注意的地方

1、對於基於外鍵的,外鍵可以放在任意的一端,存放外鍵的一端需要增加@JoinColumn註解來映射外鍵列,還應該增加unique=true屬性來表示該實體實際上是1的一端

2、對於一對一的關聯關係,兩個實體原本處於平等狀態,但是當選擇任意一端來增加外鍵後(增加@JoinColumn註解的實體段)該表即變成從表,而另一個表則成爲主表

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章