日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Hibernate】Hibernate实体关系映射——主键相同的一对一关系

發布時間:2024/4/14 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Hibernate】Hibernate实体关系映射——主键相同的一对一关系 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

主鍵相同的一對一關系

由于兩個實體類是一對一的關系,因此可設置兩個實體類使用相同的主鍵。反過來,具有相同主鍵的實體被視為一對一的關系。這樣兩個表就省掉了外鍵關聯。

以客戶地址管理為例學習主鍵相同的一對一關系:一個客戶對應一個地址,對應的實體之間使用相同的主鍵。

客戶與地址之間是一對一的關系,并且兩個實體的id是相同的。雙方都有對方的引用。注意,兩個數據庫表之間沒有關聯關系,hibernate是根據主鍵判斷對應關系的。

Customer客戶實體類中有一個id主鍵、一個name屬性以及一個Address地址屬性。其中Address地址屬性與Customer客戶實體類之間是一對一的屬性,兩者之間使用相同的主鍵,而沒有使用傳統的外鍵約束。用@OneToOne指定Address屬性為一對一的,用@PrimaryKeyJoinColumn制定兩個實體使用相同的主鍵

Customer.java

package com.lmb.hibernate.bean;import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToOne; import javax.persistence.PrimaryKeyJoinColumn; import javax.persistence.Table;@Entity @Table(name="tb_customer") public class Customer {@Id@GeneratedValue(strategy=GenerationType.AUTO) //使用主鍵生成策略來生成idprivate Integer id;private String name;@OneToOne@PrimaryKeyJoinColumn //一對一實體的主鍵相同private Address address;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}}

Adderss地址實體類具有id主鍵、Customer客戶屬性、Adderss地址、zip郵編以及telephone電話號碼等3個普通屬性。Id主鍵使用@Id標注,因為實體間使用相同的id,因此不能使用任何的主鍵生成策略。Customer屬性上用@OneToOne指定為一對一屬性,并用@PrimaryKeyJoinColumn聲明使用相同主鍵。

Address.java

package com.lmb.hibernate.bean;import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.OneToOne; import javax.persistence.PrimaryKeyJoinColumn; import javax.persistence.Table;@Entity @Table(name="tb_address") public class Address {@Id // @GeneratedValue(strategy=GenerationType.AUTO) //不能使用數據庫自動分配IDprivate Integer id;@OneToOne@PrimaryKeyJoinColumnprivate Customer customer;private String address;private String zip;private String telephone;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public Customer getCustomer() {return customer;}public void setCustomer(Customer customer) {this.customer = customer;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getZip() {return zip;}public void setZip(String zip) {this.zip = zip;}public String getTelephone() {return telephone;}public void setTelephone(String telephone) {this.telephone = telephone;}}

測試方法:

不能使用數據庫自動分配ID,自動分配的ID可能會是兩個實體對象ID不一致。hibernate也不會自動保證兩個實體ID相同,這時候要手工設置ID保證兩個實體ID一致。測試代碼如下:

TestCustomerAddress.java

package com.lmb.hibernate.test;import org.hibernate.Session; import com.lmb.hibernate.HibernateSessionFactory; import com.lmb.hibernate.bean.Address; import com.lmb.hibernate.bean.Customer;public class TestCustomerAddress {public static void main(String[] args) {//先實例化一個Customer對象Customer customer=new Customer();customer.setName("lmb");//實例化一個Address對象Address address=new Address();address.setAddress("湖北省武漢市");address.setTelephone("15802749021");address.setZip("430023");// address.setCustomer(customer);//注意:這里不設置關系Session session=HibernateSessionFactory.getSession();session.beginTransaction();//開啟事務session.persist(customer);//將Customer對象持久化到數據庫,數據庫會為customer自動分配ID//要手工設置address的ID,保證兩個ID一致address.setId(customer.getId());session.persist(address);//將Address對象持久化到數據庫session.flush();//之后從數據庫中查詢Customer對象...代碼略...} }

注意:

程序中沒有設置Address和Customer間的關系,但是查詢Customer時仍能獲取到對象的Address對象。因為hibernate會自動加載相同主鍵的另一邊的對象。

總結

以上是生活随笔為你收集整理的【Hibernate】Hibernate实体关系映射——主键相同的一对一关系的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。