天天看點

Hibernate 關系映射之一對一關聯Hibernate 關系映射之一對一關聯

Hibernate 關系映射之一對一關聯

Hibernate 最核心的功能是解決O/RMapping和事務處理。是以在此不得不論及Hibernate 關系映射

當然,這裡說的映射其實是對象之間的關系,并不是指資料庫的關系,因為Hibernate是對象化操作。

因為做項目的時候頻繁使用了關系映射,在此過程中學習了尚學堂馬士兵老師的Hibernate教程,結合自己的體會,和各位道友分享一下。

主要關系:

  • 一對一
  • 多對一
  • 一對多
  • 多對多

以上假如要細分的話下以層級還有單向關聯、多向關聯。

主要是這6種(一對多和多對一本質上沒差),

當然還有集合映射,繼承映射。不過暫時還用的少。

一、一對一單向關聯映射

前提:兩個對象之間是一對一的關系,如Person-IdCard(人—身份證号)

 那麼有兩種政策可以實作一對一的關聯映射

  •  主鍵關聯:即讓兩個對象具有相同的主鍵值,以表明它們之間的一一對應的關系;資料庫表不會有額外的字段來維護它們之間的關系,僅通過表的主鍵來關聯。
  •  唯一外鍵關聯:外鍵關聯,本來是用于多對一的配置,但是如果加上唯一的限制之後,也可以用來表示一對一關聯關系。

對象模型

實體類:

public class Person {
    private int id;
    private String name;
    public int getId() {return id;  }
    public void setId(int id) {this.id = id;}
    public String getName() {return name;}
    public void setName(Stringname) {this.name = name;}
}
           
public class IdCard {
    private int id;
    private String cardNo;
    public int getId() {return id;}
    public void setId(int id) {this.id = id;}
    public String getCardNo(){ return cardNo;}
    public void setCardNo(StringcardNo) {this.cardNo = cardNo;}
}
           

(一)唯一外鍵關聯(單向) 

1、對象模型

Hibernate 關系映射之一對一關聯Hibernate 關系映射之一對一關聯

2、關系模型 

Hibernate 關系映射之一對一關聯Hibernate 關系映射之一對一關聯

3.1、實體映射關聯(xml方式)

使用<many-to-one>标簽關聯,并使用unique="true"唯一性限制。

<hibernate-mapping>
  <class name="com.yk.hibernate.IdCard" table="id_card">
      <id name="id" column="id">
          <generator class="native"/>
      </id>
      <property name="cardNo" column="card_no"/>
  </class>
</hibernate-mapping>      
<hibernate-mapping>
  <class name="com.yk.hibernate.Person" table="person">
      <id name="id" column="id">
          <generator class="native"/>
      </id>
      <property name="name"/> 
      <!-- <many-to-one>:在多的一端 ,加入一個外鍵指向一的一端 ,但多對一關聯映射字段可重複,是以需要加入一個唯一條件限制unique="true"-->
      <many-to-one name="idCard"  column="card_id" unique="true"/>
  </class>
</hibernate-mapping>      

3.2、實體映射關聯(annotation方式) 

使用@OneToOne進行注解,來展現是一對一的關系

    IdCard類 

@Entity
public class IdCard {
    private int id;
    private String cardNo;
    @Id
    @GeneratedValue
    public int getId() {return id;}
    public void setId(int id) {this.id = id;} 
    public String getCardNo(){ return cardNo;}
    public void setCardNo(StringcardNo) {this.cardNo = cardNo;}
}
           

    Person類  

@Entity
public class Person {
    private int id;
    private String name;
    private IdCard idCard; //添加對象
    @Id
    @GeneratedValue
    public int getId() {return id;  }
    public void setId(int id) {this.id = id;}
    public String getName() {return name;}
    public void setName(Stringname) {this.name = name;}
    @OneToOne //表示一對一的關系
    @JoinColumn(name="card_id") //為外鍵指定名稱
    public IdCard getIdCard() { return idCard; } 
    public void setIdCard(IdCard idCard) { this.idCard = idCard; }

}
           

(二) 主鍵關聯(單向) 

1、對象模型 

Hibernate 關系映射之一對一關聯Hibernate 關系映射之一對一關聯

2、關系模型

Hibernate 關系映射之一對一關聯Hibernate 關系映射之一對一關聯

3.1、主鍵單向關聯(xml方式)

IdCard映射檔案,先生成ID 

<class name="com.yk.hibernate.IdCard" table="id_card">
        <id name="id"column="id">
            <generator class="native"/>
        </id>
        <property name="cardNo" column="card_no"/>
    </class>      

Person實體類映射檔案,ID是根據IdCard主鍵值,主鍵生成政策不能使用native或者identity了,而是  foreign  

<class name="com.yk.hibernate.Person"table="person">
        <id name="id"column="id">
            <generator class="foreign"> 
                <param name="property">idCard</param>
            </generator>
        </id>
        <property name="name"/> 
        <one-to-one name="idCard"constrained="true"/> 
</class>      

 3.2、主鍵單向關聯(annotation方式)

使用@OneToOne注解一對一關系,再使用@PrimaryKeyJoinColumn來注解主鍵關系映射。

Person類 

@Entity
public class Person {
    private int id;
    private String name;
    private IdCard idCard; //添加對象
    @Id 
    public int getId() {return id;  }
    public void setId(int id) {this.id = id;}
    public String getName() {return name;}
    public void setName(Stringname) {this.name = name;}
    @OneToOne //表示一對一的關系  
           

       @PrimaryKeyJoinColumn//注解主鍵關聯映射 

public IdCard getIdCard() { return idCard; } 
    public void setIdCard(IdCard idCard) { this.idCard = idCard; }

}
           

二、一對一雙向關聯映射

上面的示例可以通過身份證idCard來找到相應的人Person,而反過來卻不能查詢。是以就有了一對一雙向關聯。

例如:夫妻關系就是一對一雙向關聯關系,通過丈夫可以找到妻子,通過妻子也可以找到丈夫。

(一)唯一外鍵關聯(雙向) 

annotation方式:隻需要在未加關聯的注解mappedBy就ok了 

@Entity
public class Husband {
	private int id;
	private String name;
	private Wife wife;
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	
	public String getName() {
		return name;
	}
	@OneToOne
	@JoinColumn(name="wifeId")
	public Wife getWife() {
		return wife;
	}
	public void setId(int id) {
		this.id = id;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void setWife(Wife wife) {
		this.wife = wife;
	}
	
}
           
@Entity
public class Wife {
	private int id;
	private String name;
	private Husband husband;
	@OneToOne(mappedBy="wife")
	public Husband getHusband() {
		return husband;
	}
	public void setHusband(Husband husband) {
		this.husband = husband;
	}
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}
           

 2、xml方式:使用<one-to-one>标簽,并設定對應的關聯類 

<class name="com.yk.hibernate.Wife" table="wife">
        <id name="id" column="id">
            <generator class="native"/></id>
        <property name="name"/> 
        <one-to-one name="husband" property-ref="Wife"/>
 </class>      

繼續閱讀