一對一單向外鍵關(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屬性。
新聞熱點
疑難解答