国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

Hibernate一對一關(guān)聯(lián)

2019-11-14 20:47:43
字體:
供稿:網(wǎng)友
Hibernate一對一關(guān)聯(lián)

一對一單向外鍵關(guān)聯(lián)

1.建Husband實體類和Wife實體類,添加Annotation注解,如下

@Entitypublic class Husband {PRivate int id;private String name;private Wife wife;        @Id@GeneratedValuepublic 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;}@OneToOne                   //Husband和Wife是一對一的關(guān)系public Wife getWife() {return wife;}public void setWife(Wife wife) {this.wife = wife;}}

@Entitypublic class Wife {private int id;private String name;@Id@GeneratedValuepublic 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.在hibernate.cfg.xml中添加mapping語句

<mapping class="com.hibernate.model.Husband"/> <mapping class="com.hibernate.model.Wife"/>

3.建Junit測試類

public class ORMappingTest {@Testpublic void test() {//生成表,輸出建表語句new SchemaExport(new Configuration().configure()).create(true, true);}}

程序至此結(jié)束,運行程序,在數(shù)據(jù)庫中生成Husband表和Wife表,并在控制臺輸出建表語句。

Husband表中會自動生成屬性名為“wife_id”的外鍵,參考表為Wife表。

如果想要使用自定義的外鍵屬性名,可對Husband實體類的getWife方法添加Annotation注解,如下:

@OneToOne   //Husband和Wife是一對一的關(guān)系@JoinColumn(name="wifeId")  // java默認生成的外鍵屬性名為wife_id.設置此項后,可以任意設定其屬性名,此處設置為wifeId.public Wife getWife() {return wife;}

一對一雙向外鍵關(guān)聯(lián)

1.建Husband實體類和Wife實體類,添加Annotation注解

Husband類同上,只需在Wife類中增加一個Husband類型的變量,并添加@OneToOne注解即可,如下

@Entitypublic class Wife {private int id;private String name;private Husband husband;   //建一個Husband類型的變量,并生成setter和getter方法 @Id@GeneratedValuepublic 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;}@OneToOne(mappedBy="wife")     //"wife"指的是Husband類中的private Wife wife;public Husband getHusband() {return husband;}public void setHusband(Husband husband) {this.husband = husband;}}

凡是雙向關(guān)聯(lián),必設mappedBy

2.在hibernate.cfg.xml中添加mapping語句----同上

3.建Junit測試類----同上

程序至此結(jié)束,運行程序,在數(shù)據(jù)庫中生成Husband表和Wife表,并在控制臺輸出建表語句。

聯(lián)合主鍵

聯(lián)合主鍵(3種方式)    將主鍵類注解為@Embeddable,并將主鍵(pk)的屬性注解為@Id (不常用)    將主鍵的屬性注解為@EmbeddedId      將實體類注解為@IdClass(組件類.class),并將該實體類中所有屬于主鍵的屬性都注解為@Id

示例:建Wife表,屬性有id,name,age。其中id和name為聯(lián)合主鍵

1.建主鍵類WifePK

/* * 建立主鍵類WifePK * 需實現(xiàn)Serializable接口,此接口用于把當前類的接口進行序列化 * 需重寫equals()和hashCode()方法,以保證對象的唯一性 *   **/public class WifePK implements java.io.Serializable{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(String name) {this.name = name;}@Overridepublic boolean equals(Object o){if(o instanceof WifePK){WifePK pk = (WifePK) o;if(this.id == pk.getId() && this.name.equals(pk.getName())){return true;}}return false;}@Overridepublic int hashCode(){return this.name.hashCode();}}

2.建實體類Wife

第二種方式注解,@EmbeddedId

@Entitypublic class Wife {private WifePK pk;    //增加WifePK類型的變量,并添加getter和setter方法private int age;@EmbeddedId              //將其注解為聯(lián)合主鍵public WifePK getPk() {return pk;}public void setPk(WifePK pk) {this.pk = pk;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}

第三種方式注解,@IdClass

@Entity@IdClass(WifePK.class)   //將實體類注解為@IdClasspublic class Wife {private int id;private String name;private int age;@Id               //將該實體類中屬于主鍵的屬性注解為@Id public int getId() {return id;}public void setId(int id) {this.id = id;}@Id                //將該實體類中屬于主鍵的屬性注解為@Id public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}

3.寫Junit測試類

第二種方式注解,@EmbeddedId

public class WifeTest {private static sessionFactory sf = null;@BeforeClasspublic static void beforeClass() {sf = new Configuration().configure().buildSessionFactory();}@AfterClasspublic static void afterClass() {sf.close();}@Testpublic void test() {WifePK pk = new WifePK();pk.setId(1);pk.setName("zhangsan");Wife wife = new Wife();wife.setPk(pk);wife.setAge(32);Session session = sf.getCurrentSession();session.beginTransaction();session.save(wife);session.getTransaction().commit();}}

第三種方式注解,@IdClass,只需修改其test()方法,如下:

@Testpublic void test() {Wife wife = new Wife();wife.setId(1);wife.setName("zhangsan");wife.setAge(32);Session session = sf.getCurrentSession();session.beginTransaction();session.save(wife);session.getTransaction().commit();}

程序至此結(jié)束,運行程序,在數(shù)據(jù)庫中生成Wife表,id和name為主鍵,并將對象wife存入Wife表。

聯(lián)合主鍵關(guān)聯(lián)

示例:

建Husband表,屬性有id和name

建Wife表,屬性有id,name,age。其中id和name為聯(lián)合主鍵

設置聯(lián)合主鍵關(guān)聯(lián),在Husband表中生成屬性名為wife_id和wife_name的外鍵,分別參考Wife表中的id和name

1.建Husband實體類、Wife實體類和WifePK主鍵類,添加Annotation注解

Husband類,同上

WifePK類,同上

Wife類,同“聯(lián)合主鍵”部分第三種方式注解的Wife實體類

2.在hibernate.cfg.xml中添加mapping語句----同上

3.建Junit測試類ORMappingTest----同上

程序至此結(jié)束,運行程序,在數(shù)據(jù)庫中生成Husband表和Wife表,并在控制臺輸出建表語句。

Husband表中會自動生成屬性名為“wife_id”和“wife_name”的外鍵,參考表為Wife表。

如果想要使用自定義的外鍵屬性名,可對Husband實體類的getWife方法添加Annotation注解,如下:

@OneToOne@JoinColumns({@JoinColumn(name="wifeId",referencedColumnName="id"),@JoinColumn(name="wifeName",referencedColumnName="name")})public Wife getWife() {return wife;}

組件映射

除了粗粒度的對象模型設計(一個表映射成一個持久化類)之外,還可以采用細粒度的對象模型,把一個表映射成兩個或者多個類。

被細化出來的類,可以稱為組件(Component)。

組件是某個實體的邏輯組成部分,它與實體的本質(zhì)區(qū)別在于組件沒有id,可以把組件當做值對象。

舉例來說:Husband類有id、name、wifeName、wifeAge等屬性,將wifeName、wifeAge從Husband實體類中拿出來,單獨建一個Wife類,這個類就叫做值對象,也就是所說的組件。表現(xiàn)在數(shù)據(jù)庫中,將只有husband一張表,有id、name、wifeName、wifeAge屬性。

采用組件映射的優(yōu)點:實現(xiàn)了對象細粒度的劃分,層次更加分明,復用率高。

1.建立Husband實體類和Wife組件類,添加Annotation注解

Husband類同上,只是不需要添加@OneToOne注解,改為@Embedded注解,如下:

@Embeddedpublic Wife getWife() {return wife;}

Wife類無需添加任何注解,如下:

public class Wife {private String wifeName;private int wifeAge;public String getWifeName() {return wifeName;}public void setWifeName(String wifeName) {this.wifeName = wifeName;}public int getWifeAge() {return wifeAge;}public void setWifeAge(int wifeAge) {this.wifeAge = wifeAge;}}

2.在hibernate.cfg.xml中添加mapping語句

只需添加Husband的mapping,Wife類不是實體類,無需添加。

3.建Junit測試類ORMappingTest----同上

程序至此結(jié)束,運行程序,在數(shù)據(jù)庫中生成Husband表,并在控制臺輸出建表語句。

Husband表中有id、name、wifeName、wifeAge屬性。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 景洪市| 水富县| 内黄县| 高密市| 鸡西市| 江口县| 石狮市| 韶关市| 中山市| 贺州市| 龙川县| 青海省| 曲周县| 枣强县| 博爱县| 黔东| 盐源县| 霍林郭勒市| 高安市| 蒙自县| 徐汇区| 小金县| 山东| 旌德县| 鄱阳县| 绥棱县| 思南县| 霞浦县| 彝良县| 古田县| 乌兰县| 黄平县| 衢州市| 卓尼县| 新安县| 东至县| 绵阳市| 宝兴县| 田东县| 德化县| 于田县|