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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Hibernate 实体关联关系映射----总结

發(fā)布時間:2024/4/17 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hibernate 实体关联关系映射----总结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

http://lavasoft.blog.51cto.com/62575/39398

Hibernate 實體關(guān)聯(lián)關(guān)系映射----總結(jié) 花了三天的業(yè)余時間,終于寫完了Hibernate關(guān)聯(lián)關(guān)系映射的所有實例,感覺還應(yīng)該總結(jié)一下。 Hibernate映射關(guān)系錯綜復(fù)雜,在實際中真的都能用到嗎?不用行嗎? 在我看來,Hibernate提供這些映射關(guān)系,常用就是一對一和多對一,并且在能不用連接表的時候盡量不要用連接表。多對多會用到,如果用到了,應(yīng)該首先考慮底層數(shù)據(jù)庫設(shè)計是否合理。 在實際開發(fā)中,在Hibernate關(guān)聯(lián)關(guān)系之外常常還有另外一種選擇方案,表各自作為單表映射,業(yè)務(wù)邏輯控制外鍵關(guān)系(有時候就是一個相關(guān)聯(lián)的列,但不一定要加外鍵約束),這樣更加靈活,并且數(shù)據(jù)的完整性同樣有保證。 當然,“單表映射,業(yè)務(wù)控制外鍵關(guān)系”并不是說Hibernate的實體關(guān)聯(lián)功能是多余的,Hibernate的實體關(guān)聯(lián)的優(yōu)點很多,隨便拿本書都是講優(yōu)點,用好了會讓開發(fā)人員感覺更方便,現(xiàn)在我也是兩種方案結(jié)合使用。比如對于不很確定的兩個實體,常常選用單表關(guān)聯(lián)。 以前在初學Hibernate還沒有完全搞清楚這些關(guān)聯(lián)關(guān)系的時候,就是用單表映射,業(yè)務(wù)控制外鍵關(guān)系做的,發(fā)現(xiàn)沒有任何問題,程序同樣運行得很好。 看了這些是不是后悔浪費時間學習映射關(guān)系了?呵呵,Hibernate的OR Mapping是Hibernate的靈魂,我相信Hibernate的創(chuàng)始人比我們一般人的理解更深刻。只有學會了這些才能體會Hibernate設(shè)計者的思想。學一個東西,不光自己寫代碼,還應(yīng)該能看懂別人的代碼才行。因此系統(tǒng)學習這些關(guān)聯(lián)映射還是大有必要的。 以上都是我自己的觀點。歡迎在此交流討論。 Hibernate在實際項目開發(fā)中,hbm.xml包括數(shù)據(jù)庫腳本都是通過Xdoclet生成的,在此不采用Xdoclet的目的是為了便于理解這些映射模型。實體-數(shù)據(jù)表-映射文件 三者對比看,太直觀了。 瞌睡了,暫時先寫到此,有新思路了再補上。。。。 ----------------------------------------------------- 回Hibernate:Hibernate關(guān)聯(lián)關(guān)系映射實例速查 Hibernate關(guān)聯(lián)關(guān)系映射目錄

├─單向關(guān)聯(lián)
│? ├─? 一對一外鍵單向關(guān)聯(lián)
│? ├─? 一對一主鍵單向關(guān)聯(lián)
│? ├─? 一對一連接表單向關(guān)聯(lián)
│? ├─? 一對多外鍵單向關(guān)聯(lián)
│? ├─? 一對多連接表單向關(guān)聯(lián)
│? ├─? 多對一外鍵單向關(guān)聯(lián)
│? ├─? 多對一連接表單向關(guān)聯(lián)
│? └─? 多對多單向關(guān)聯(lián)
└─雙向關(guān)聯(lián)
??? ├─? 一對一外鍵雙向關(guān)聯(lián)
??? ├─? 一對一主鍵雙向關(guān)聯(lián)
??? ├─? 一對一連接表雙向關(guān)聯(lián)
??? ├─? 一對多外鍵雙向關(guān)聯(lián)
??? ├─? 一對多連接表雙向關(guān)聯(lián)
??? └─? 多對多雙向關(guān)聯(lián)

?

Hibernate 一對一外鍵單向關(guān)聯(lián) ? ??? 事實上,單向1-1與N-1的實質(zhì)是相同的,1-1是N-1的特例,單向1-1與N-1的映射配置也非常相似。只需要將原來的many-to-one元素增加unique="true"屬性,用于表示N的一端也必須是唯一的,在N的一端增加了唯一的約束,即成為單向1-1。基于外鍵的單向1-1的配置將與無連接表N-1關(guān)聯(lián)的many-to-one增加unique="true"屬性即可。 ? 一、模型介紹 ? 一個人(Person)對應(yīng)一個地址(Address)。 ? 二、實體(省略getter、setter方法) ? public class Person11fk { ??? private int personid; ??? private String name; ??? private int age; ??? private Address11fk address11fk; ? public class Address11fk { ??? private int addressid; ??? private String addressdetail; ? 三、表模型 mysql> desc address_11fk; +---------------+--------------+------+-----+---------+----------------+ | Field???????? | Type???????? | Null | Key | Default | Extra????????? | +---------------+--------------+------+-----+---------+----------------+ | addressid???? | int(11)????? | NO?? | PRI | NULL??? | auto_increment | | addressdetail | varchar(255) | YES? |???? | NULL??? |??????????????? | +---------------+--------------+------+-----+---------+----------------+ ? mysql> desc person_11fk; +-----------+--------------+------+-----+---------+----------------+ | Field???? | Type???????? | Null | Key | Default | Extra????????? | +-----------+--------------+------+-----+---------+----------------+ | personid? | int(11)????? | NO?? | PRI | NULL?? ?| auto_increment | | name????? | varchar(255) | YES? |???? | NULL??? |??????????????? | | age?????? | int(11)????? | YES? |???? | NULL??? |??????????????? | | addressId | int(11)????? | YES? | UNI | NULL??? |??????????????? | +-----------+--------------+------+-----+---------+----------------+ ? 四、生成的SQL腳本 ? CREATE TABLE `address_11fk` (
????`addressid` int(11) NOT NULL auto_increment,
????`addressdetail` varchar(255) default NULL,
????PRIMARY KEY????(`addressid`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=gbk;
????
CREATE TABLE `person_11fk` (
????`personid` int(11) NOT NULL auto_increment,
????`name` varchar(255) default NULL,
????`age` int(11) default NULL,
????`addressId` int(11) default NULL,
????PRIMARY KEY????(`personid`),
????KEY `FK68A8818F3F45AA77` (`addressId`),
????CONSTRAINT `FK68A8818F3F45AA77` FOREIGN KEY (`addressId`) REFERENCES `address_11fk` (`addressid`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=gbk;
? ? 五、映射方法: ??? 在Person中添加Address屬性,映射配置為: ??????? <!--用來映射關(guān)聯(lián)PO column是Address在該表中的外鍵列名,增加unique變成“1-1”--> ??????? <many-to-one name="address11fk" column="addressId" unique="true"/> ? <hibernate-mapping>
????????<class name="com.lavasoft.dx._1_1_fk.Address11fk" table="ADDRESS_11fk">
????????????????<id name="addressid">
????????????????????????<generator class="identity"/>
????????????????</id>
????????????????<property name="addressdetail"/>
????????</class>
</hibernate-mapping> ? <hibernate-mapping>
????????<class name="com.lavasoft.dx._1_1_fk.Person11fk" table="PERSON_11fk">
????????????????<id name="personid">
????????????????????????<generator class="identity"/>
????????????????</id>
????????????????<property name="name"/>
????????????????<property name="age"/>
????????????????<!--用來映射關(guān)聯(lián)PO column是Address在該表中的外鍵列名,增加unique變成“1-1”-->
????????????????<many-to-one name="address11fk" column="addressId" unique="true"/>
????????</class>
</hibernate-mapping> ??????? ? 六、測試方法 ? public class Test_11fk {
????????public static void main(String[] args){
????????????????Person11fk p1=new Person11fk();
????
????????????????p1.setAge(21);
????????????????p1.setName("p1");
????
????????????????Address11fk add1=new Address11fk();
????????????????add1.setAddressdetail("鄭州市經(jīng)三路");
????
????????????????p1.setAddress11fk(add1);
????
????????????????Session session= HibernateUtil.getCurrentSession();
????????????????Transaction tx=session.beginTransaction();
????????????????session.save(add1);
????????????????session.save(p1);
????????????????tx.commit();
????????????????HibernateUtil.closeSession();
????????}
} ? ? 七、測試結(jié)果 ? 1) :正常保存. 推薦這么干! ??????? session.save(add1); ??????? session.save(p1); ? Hibernate: insert into ADDRESS_11fk (addressdetail) values (?) Hibernate: insert into PERSON_11fk (name, age, addressId) values (?, ?, ?) ? 2) :正常保存. ??????? session.save(p1); ??????? session.save(add1); ? Hibernate: insert into PERSON_11fk (name, age, addressId) values (?, ?, ?) Hibernate: insert into ADDRESS_11fk (addressdetail) values (?) Hibernate: update PERSON_11fk set name=?, age=?, addressId=? where personid=? ? 3) :正常保存. //??????? session.save(p1); ??????? session.save(add1); ? Hibernate: insert into ADDRESS_11fk (addressdetail) values (?) ? 4) : 發(fā)生異常,不能保存. ??????? session.save(p1); //??????? session.save(add1); ? Hibernate: insert into PERSON_11fk (name, age, addressId) values (?, ?, ?) Exception in thread "main" org.hibernate.TransientObjectException: com.lavasoft.dx._1_1_fk.Address11fk ===========

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

?

1-1的關(guān)聯(lián)可以基于主鍵關(guān)聯(lián),但基于主鍵關(guān)聯(lián)的持久化類不能擁有自己的主鍵生成策略,它的主鍵由關(guān)聯(lián)類負責生成。另外,另外,增加one-to-one元素來關(guān)聯(lián)屬性,必須為one-to-one元素增加constrained="true"屬性,表明該類主鍵由關(guān)聯(lián)類生成。

???

一、模型介紹

?

一個人(Person)對應(yīng)一個地址(Address)。

?

二、實體(省略getter、setter方法)

?

public class Person11pk {

??? private int personid;

??? private String name;

??? private int age;

??? private Address11pk address11pk;

?

public class Address11pk {

??? private int addressid;

??? private String addressdetail;

?

三、表模型

?

mysql> desc address_11pk;

+---------------+--------------+------+-----+---------+----------------+

| Field???????? | Type???????? | Null | Key | Default | Extra????????? |

+---------------+--------------+------+-----+---------+----------------+

| addressid???? | int(11)????? | NO?? | PRI | NULL??? | auto_increment |

| addressdetail | varchar(255) | YES? |???? | NULL??? |??????????????? |

+---------------+--------------+------+-----+---------+----------------+

?

mysql> desc person_11pk;

+----------+--------------+------+-----+---------+-------+

| Field??? | Type???????? | Null | Key | Default | Extra |

+----------+--------------+------+-----+---------+-------+

| personid | int(11)????? | NO?? | PRI |???????? |?????? |

| name? ???| varchar(255) | YES? |???? | NULL??? |?????? |

| age????? | int(11)????? | YES? |???? | NULL??? |?????? |

+----------+--------------+------+-----+---------+-------+

?

四、生成的SQL腳本

?

/* Formatted on 2007/08/22 14:40 (QP5 v5.50) */

CREATE TABLE `address_11pk` (

? `addressid` int(11) NOT NULL auto_increment,

? `addressdetail` varchar(255) default NULL,

? PRIMARY KEY? (`addressid`)

) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=gbk;

?

?

/* Formatted on 2007/08/22 14:41 (QP5 v5.50) */

CREATE TABLE `person_11pk` (

? `presonid` int(11) NOT NULL,

? `name` varchar(255) default NULL,

? `age` int(11) default NULL,

? PRIMARY KEY? (`presonid`),

? KEY `FK68A882C591BB393E` (`presonid`),

? CONSTRAINT `FK68A882C591BB393E` FOREIGN KEY (`presonid`) REFERENCES `address_11pk` (`addressid`)

) ENGINE=InnoDB DEFAULT CHARSET=gbk;

?

?

五、映射方法:在Person中配置id生成策略為:

?

??????? <id name="personid">

??????????? <!--基于主鍵關(guān)聯(lián)時,主鍵生成策略是foreign,表明根據(jù)關(guān)聯(lián)類生成主鍵-->

??????????? <generator class="foreign">

??????????????? <!--關(guān)聯(lián)持久化類的屬性名-->

??????????????? <param name="property">address11pk</param>

??????????? </generator>

??????? </id>

??????? ......

??????? <!--用于映射1-1關(guān)聯(lián)-->

??????? <one-to-one name="address11pk" constrained="true"/>

?

<hibernate-mapping>

??? <class name="com.lavasoft.dx._1_1_pk.Person11pk" table="PERSON_11pk">

??????? <id name="personid" column="presonid">

? ??????????<!--基于主鍵關(guān)聯(lián)時,主鍵生成策略是foreign,表明根據(jù)關(guān)聯(lián)類生成主鍵-->

??????????? <generator class="foreign">

??????????????? <!--關(guān)聯(lián)持久化類的屬性名-->

??????????????? <param name="property">address11pk</param>

??????????? </generator>

??????? </id>

??????? <property name="name"/>

??????? <property name="age"/>

??????? <!--用于映射1-1關(guān)聯(lián)-->

??????? <one-to-one name="address11pk" constrained="true"/>

??? </class>

</hibernate-mapping>

?

<hibernate-mapping>

??? <class name="com.lavasoft.dx._1_1_pk.Address11pk" table="ADDRESS_11pk">

??????? <id name="addressid">

??????????? <generator class="identity"/>

??????? </id>

??????? <property name="addressdetail"/>

??? </class>

</hibernate-mapping>

?

?

六、測試方法

?

public class Test_11pk {

??? public static void main(String[] args){

??????? Person11pk p1=new Person11pk();

?

??????? p1.setAge(21);

??????? p1.setName("p1");

?

??????? Address11pk add1=new Address11pk();

??????? add1.setAddressdetail("鄭州市經(jīng)三路");

?

??????? p1.setAddress11pk(add1);

?

??????? Session session= HibernateUtil.getCurrentSession();

??????? Transaction tx=session.beginTransaction();

??????? session.save(add1);

??????? session.save(p1);

??????? tx.commit();

??????? HibernateUtil.closeSession();

??? }

}

?

?

七、測試結(jié)果

?

1) :正常保存. 推薦這么干!

??????? session.save(add1);

??????? session.save(p1);

?

Hibernate: insert into ADDRESS_11fk (addressdetail) values (?)

Hibernate: insert into PERSON_11fk (name, age, addressId) values (?, ?, ?)

?

2) :正常保存.

??????? session.save(p1);

??????? session.save(add1);

?

Hibernate: insert into PERSON_11fk (name, age, addressId) values (?, ?, ?)

Hibernate: insert into ADDRESS_11fk (addressdetail) values (?)

Hibernate: update PERSON_11fk set name=?, age=?, addressId=? where personid=?

?

3) :正常保存.

//??????? session.save(p1);

??????? session.save(add1);

?

Hibernate: insert into ADDRESS_11fk (addressdetail) values (?)

?

4) : 發(fā)生異常,不能保存.

??????? session.save(p1);

//??????? session.save(add1);

?

Hibernate: insert into PERSON_11fk (name, age, addressId) values (?, ?, ?)

Exception in thread "main" org.hibernate.TransientObjectException: com.lavasoft.dx._1_1_fk.Address11fk

?

==========================================

Hibernate 一對一連接表單向關(guān)聯(lián)
這種情況很少見,但Hibernate同樣允許采用連接表關(guān)聯(lián)1-1.有連接表的1-1同樣只需要將N-1的many-to-one元素增加unique="true"屬性即可。
一、模型介紹
一個人(Person)對應(yīng)一個地址(Address)。
二、實體(省略getter、setter方法)
public class Person11tab {
private int personid;
private String name;
private int age;
private Address11tab address11tab;
public class Address11tab {
private int addressid;
private String addressdetail;
三、表模型
mysql> desc address_11tab;
+---------------+--------------+------+-----+---------+----------------+
| Field???????? | Type???????? | Null | Key | Default | Extra????????? |
+---------------+--------------+------+-----+---------+----------------+
| addressid???? | int(11)????? | NO?? | PRI | NULL??? | auto_increment |
| addressdetail | varchar(255) | YES? |???? | NULL??? |??????????????? |
+---------------+--------------+------+-----+---------+----------------+
mysql> desc join_11tab;
+--------------+---------+------+-----+---------+-------+
| Field??????? | Type??? | Null | Key | Default | Extra |
+--------------+---------+------+-----+---------+-------+
| personid???? | int(11) | NO?? | PRI |???????? |?????? |
| address11tab | int(11) | YES? | UNI | NULL??? |?????? |
+--------------+---------+------+-----+---------+-------+
mysql> desc person_11tab;
+----------+--------------+------+-----+---------+----------------+
| Field??? | Type???????? | Null | Key | Default | Extra????????? |
+----------+--------------+------+-----+---------+----------------+
| personid | int(11)????? | NO?? | PRI | NULL??? | auto_increment |
| name???? | varchar(255) | YES? |???? | NULL??? |??????????????? |
| age????? | int(11)????? | YES? |???? | NULL??? |??????????????? |
+----------+--------------+------+-----+---------+----------------+
四、生成的SQL腳本
/* Formatted on 2007/08/20 16:52 (QP5 v5.50) */
CREATE TABLE `join_11tab` (
`personid` int(11) NOT NULL,
`address11tab` int(11) default NULL,
PRIMARY KEY? (`personid`),
UNIQUE KEY `address11tab` (`address11tab`),
KEY `FK6B44BE20C4CC3D33` (`address11tab`),
KEY `FK6B44BE209049BB1F` (`personid`),
CONSTRAINT `FK6B44BE209049BB1F` FOREIGN KEY (`personid`) REFERENCES `person_11tab` (`personid`),
CONSTRAINT `FK6B44BE20C4CC3D33` FOREIGN KEY (`address11tab`) REFERENCES `address_11tab` (`addressid`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
?
/* Formatted on 2007/08/20 16:53 (QP5 v5.50) */
CREATE TABLE `address_11tab` (
`addressid` int(11) NOT NULL auto_increment,
`addressdetail` varchar(255) default NULL,
PRIMARY KEY? (`addressid`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=gbk;
/* Formatted on 2007/08/20 16:53 (QP5 v5.50) */
CREATE TABLE `person_11tab` (
`personid` int(11) NOT NULL auto_increment,
`name` varchar(255) default NULL,
`age` int(11) default NULL,
PRIMARY KEY? (`personid`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=gbk;
五、映射方法:在Person中添加Address屬性,映射配置為:
<!--使用join元素顯式確定鏈接表-->
<join table="join_11tab">
<key column="personid"/>
<!--映射1-1關(guān)聯(lián)屬性,其中unique=“true”屬性確定為“1-1”-->
<many-to-one name="address11tab" unique="true"/>
</join>
<hibernate-mapping>
<class name="com.lavasoft.dx._1_1_tab.Person11tab" table="PERSON_11tab">
<id name="personid">
<generator class="identity"/>
</id>
<property name="name"/>
<property name="age"/>
<!--使用join元素顯式確定鏈接表-->
<join table="join_11tab">
<key column="personid"/>
<!--映射1-1關(guān)聯(lián)屬性,其中unique=“true”屬性確定為“1-1”-->
<many-to-one name="address11tab" unique="true"/>
</join>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.lavasoft.dx._1_1_tab.Address11tab" table="ADDRESS_11tab">
<id name="addressid">
<generator class="identity"/>
</id>
<property name="addressdetail"/>
</class>
</hibernate-mapping>
六、測試方法
public class Test_11tab {
public static void main(String[] args){
Person11tab p1=new Person11tab();
p1.setAge(21);
p1.setName("p1");
Address11tab add1=new Address11tab();
add1.setAddressdetail("鄭州市經(jīng)三路");
??????? p1.setAddress11tab(add1);
Session session= HibernateUtil.getCurrentSession();
Transaction tx=session.beginTransaction();
session.save(add1);
session.save(p1);
tx.commit();
HibernateUtil.closeSession();
}
}
七、測試結(jié)果
1) :正常保存. 推薦這么干!
session.save(add1);
session.save(p1);
Hibernate: insert into ADDRESS_11tab (addressdetail) values (?)
Hibernate: insert into PERSON_11tab (name, age) values (?, ?)
Hibernate: insert into join_11tab (address11tab, personid) values (?, ?)
2) :正常保存.
session.save(p1);
session.save(add1);
Hibernate: insert into PERSON_11tab (name, age) values (?, ?)
Hibernate: insert into join_11tab (address11tab, personid) values (?, ?)
Hibernate: insert into ADDRESS_11tab (addressdetail) values (?)
Hibernate: update join_11tab set address11tab=? where personid=?
3) :正常保存.
//??????? session.save(p1);
session.save(add1);
Hibernate: insert into ADDRESS_11tab (addressdetail) values (?)
4) : 發(fā)生異常,不能保存.
session.save(p1);
//??????? session.save(add1);
Hibernate: insert into PERSON_11tab (name, age) values (?, ?)
Hibernate: insert into join_11tab (address11tab, personid) values (?, ?)
Exception in thread "main" org.hibernate.TransientObjectException: com.lavasoft.dx._1_1_tab.Address11tab

=====================================

Hibernate 一對多外鍵單向關(guān)聯(lián)
這種情況很少見,但Hibernate同樣允許采用連接表關(guān)聯(lián)1-1.有連接表的1-1同樣只需要將N-1的many-to-one元素增加unique="true"屬性即可。
一、模型介紹
一個人(Person)對應(yīng)多個地址(Address),比如家庭地址、公司地址。
二、實體(省略getter、setter方法)
public class Person1nfk implements Serializable {
private int personid;
private String name;
private int age;
private Set addresses=new HashSet();
public class Address1nfk implements Serializable {
private int addressid;
private String addressdetail;
三、表模型
mysql> desc address_1nfk;
+---------------+--------------+------+-----+---------+----------------+
| Field???????? | Type???????? | Null | Key | Default | Extra????????? |
+---------------+--------------+------+-----+---------+----------------+
| addressid???? | int(11)????? | NO?? | PRI | NULL??? | auto_increment |
| addressdetail | varchar(255) | YES? |???? | NULL??? |??????????????? |
| personid????? | int(11)?? ???| YES? | MUL | NULL??? |??????????????? |
+---------------+--------------+------+-----+---------+----------------+
mysql> desc person_1nfk;
+----------+--------------+------+-----+---------+----------------+
| Field??? | Type???????? | Null | Key | Default | Extra????????? |
+----------+--------------+------+-----+---------+----------------+
| personid | int(11)????? | NO?? | PRI | NULL??? | auto_increment |
| name???? | varchar(255) | YES? |???? | NULL??? |??????????????? |
| age????? | int(11)????? | YES? |???? | NULL??? |??????????????? |
+----------+--------------+------+-----+---------+----------------+
四、生成的SQL腳本
/* Formatted on 2007/08/21 10:06 (QP5 v5.50) */
CREATE TABLE `address_1nfk` (
`addressid` int(11) NOT NULL auto_increment,
`addressdetail` varchar(255) default NULL,
`addresses` int(11) default NULL,
PRIMARY KEY? (`addressid`),
KEY `FK9B93456DC08D1667` (`addresses`),
CONSTRAINT `FK9B93456DC08D1667` FOREIGN KEY (`addresses`) REFERENCES `person_1nfk` (`personid`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=gbk;
/* Formatted on 2007/08/21 10:07 (QP5 v5.50) */
CREATE TABLE `person_1nfk` (
`personid` int(11) NOT NULL auto_increment,
`name` varchar(255) default NULL,
`age` int(11) default NULL,
PRIMARY KEY? (`personid`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=gbk;
五、映射方法:在實體類Person里面添加Address的集合,即可形成一對多關(guān)系。
<!--映射集合屬性,關(guān)聯(lián)到持久化類,inverse="false"表示主控端在Person1nfk端,lazy="false"表示不采用延遲加載-->
<set name="addresses"
table="ADDRESS_1nfk"
cascade="all"
>
<!--確定關(guān)聯(lián)的外鍵列-->
<key column="personid"/>
<!--用以映射到關(guān)聯(lián)類屬性-->
<one-to-many class="com.lavasoft.dx._1_n_fk.Address1nfk"/>
</set>
<hibernate-mapping>
<class name="com.lavasoft.dx._1_n_fk.Person1nfk" table="PERSON_1nfk">
<id name="personid">
<generator class="identity"/>
</id>
<property name="name"/>
<property name="age"/>
<!--映射集合屬性,關(guān)聯(lián)到持久化類,inverse="false"表示主控端在Person1nfk端,lazy="false"表示不采用延遲加載-->
<set name="addresses"
table="ADDRESS_1nfk"
cascade="all"
>
<!--確定關(guān)聯(lián)的外鍵列-->
<key column="personid"/>
<!--用以映射到關(guān)聯(lián)類屬性-->
<one-to-many class="com.lavasoft.dx._1_n_fk.Address1nfk"/>
</set>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.lavasoft.dx._1_n_fk.Address1nfk" table="ADDRESS_1nfk">
<id name="addressid">
<generator class="identity"/>
</id>
<property name="addressdetail"/>
</class>
</hibernate-mapping>
六、測試方法
public class Test_1nfk {
public static void main(String[] args){
Address1nfk add1=new Address1nfk();
Address1nfk add2=new Address1nfk();
Person1nfk p=new Person1nfk();
add1.setAddressdetail("鄭州市經(jīng)三路");
add2.setAddressdetail("合肥市宿州路");
p.setName("wang");
p.setAge(30);
p.getAddresses().add(add1);
p.getAddresses().add(add2);
Session session= HibernateUtil.getCurrentSession();
Transaction tx=session.beginTransaction();
session.save(add1);
session.save(add2);
session.save(p);
tx.commit();
HibernateUtil.closeSession();
}
}
七、測試結(jié)果
1) :正常保存.
//??????? session.save(add1);
//??????? session.save(add2);
session.save(p);
Hibernate: insert into PERSON_1nfk (name, age) values (?, ?)
Hibernate: insert into ADDRESS_1nfk (addressdetail) values (?)
Hibernate: insert into ADDRESS_1nfk (addressdetail) values (?)
Hibernate: update ADDRESS_1nfk set personid=? where addressid=?
Hibernate: update ADDRESS_1nfk set personid=? where addressid=?
2) :正常保存.
session.save(add1);
session.save(add2);
session.save(p);
Hibernate: insert into ADDRESS_1nfk (addressdetail) values (?)
Hibernate: insert into ADDRESS_1nfk (addressdetail) values (?)
Hibernate: insert into PERSON_1nfk (name, age) values (?, ?)
Hibernate: update ADDRESS_1nfk set personid=? where addressid=?
Hibernate: update ADDRESS_1nfk set personid=? where addressid=?
3) :正常保存.
session.save(add1);
session.save(add2);
//??????? session.save(p);
Hibernate: insert into ADDRESS_1nfk (addressdetail) values (?)
Hibernate: insert into ADDRESS_1nfk (addressdetail) values (?)

=============================

Hibernate 一對多連接表單向關(guān)聯(lián)

?

?

一、模型介紹

?

一個人(Person)對應(yīng)多個地址(Address),比如家庭地址、公司地址。

?

二、實體(省略getter、setter方法)

?

public class Person1ntab {

??? private int personid;

??? private String name;

??? private int age;

??? private Set addresses=new HashSet();

?

public class Address1nfk implements Serializable {

??? private int addressid;

??? private String addressdetail;

?

三、表模型

?

mysql> desc join_1ntab;

+-----------+---------+------+-----+---------+-------+

| Field???? | Type??? | Null | Key | Default | Extra |

+-----------+---------+------+-----+---------+-------+

| personid? | int(11) | NO?? | PRI |???????? |?????? |

| addressid | int(11) | NO?? | PRI |???????? |?????? |

+-----------+---------+------+-----+---------+-------+

?

mysql> desc person_1ntab;

+----------+--------------+------+-----+---------+----------------+

| Field??? | Type???????? | Null | Key | Default | Extra????????? |

+----------+--------------+------+-----+---------+----------------+

| personid | int(11) ?????| NO?? | PRI | NULL??? | auto_increment |

| name???? | varchar(255) | YES? |???? | NULL??? |??????????????? |

| age????? | int(11)????? | YES? |???? | NULL??? |??????????????? |

+----------+--------------+------+-----+---------+----------------+

?

mysql> desc address_1ntab;

+---------------+--------------+------+-----+---------+----------------+

| Field???????? | Type???????? | Null | Key | Default | Extra????????? |

+---------------+--------------+------+-----+---------+----------------+

| addressid???? | int(11)????? | NO?? | PRI | NULL??? | auto_increment |

| addressdetail | varchar(255) | YES? |???? | NULL??? |??????????????? |

+---------------+--------------+------+-----+---------+----------------+

?

四、生成的SQL腳本

?

/* Formatted on 2007/08/21 10:58 (QP5 v5.50) */

CREATE TABLE `address_1ntab` (

? `addressid` int(11) NOT NULL auto_increment,

? `addressdetail` varchar(255) default NULL,

? PRIMARY KEY? (`addressid`)

) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=gbk;

?

/* Formatted on 2007/08/21 10:58 (QP5 v5.50) */

CREATE TABLE `join_1ntab` (

? `personid` int(11) NOT NULL,

? `addressid` int(11) NOT NULL,

? PRIMARY KEY? (`personid`,`addressid`),

? UNIQUE KEY `addressid` (`addressid`),

? KEY `FK6B6078C3C8DF5BFF` (`personid`),

? KEY `FK6B6078C3C2B11347` (`addressid`),

? CONSTRAINT `FK6B6078C3C2B11347` FOREIGN KEY (`addressid`) REFERENCES `address_1ntab` (`addressid`),

? CONSTRAINT `FK6B6078C3C8DF5BFF` FOREIGN KEY (`personid`) REFERENCES `person_1ntab` (`personid`)

) ENGINE=InnoDB DEFAULT CHARSET=gbk;

?

/* Formatted on 2007/08/21 10:58 (QP5 v5.50) */

CREATE TABLE `person_1ntab` (

? `personid` int(11) NOT NULL auto_increment,

? `name` varchar(255) default NULL,

? `age` int(11) default NULL,

? PRIMARY KEY? (`personid`)

) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=gbk;

?

?

五、映射方法

?

<hibernate-mapping>

??? <class name="com.lavasoft.dx._1_n_tab.Person1ntab" table="PERSON_1ntab">

??????? <id name="personid">

??????????? <generator class="identity"/>

??????? </id>

??????? <property name="name"/>

??????? <property name="age"/>

??????? <!--映射集合屬性,join_1ntab是連接表表名-->

??????? <set name="addresses"

???????????? table="join_1ntab"

??????????????? >

??????????? <!--“column="personid"”確定PERSON_1ntab表關(guān)聯(lián)到連接表的外鍵列名-->

??????????? <key column="personid"/>

??????????? <!--“column="addressid"”關(guān)聯(lián)PERSON_1ntab表的Address1ntab對象的id在連接表中的列名-->

??????????? <!--“unique="true"表示1-N,Person1ntab是1,Address1ntab是多”-->

??????????? <many-to-many

??????????????????? column="addressid"

??????????????????? unique="true"

???????????????? ???class="com.lavasoft.dx._1_n_tab.Address1ntab"/>

??????? </set>

??? </class>

</hibernate-mapping>

?

<hibernate-mapping>

??? <class name="com.lavasoft.dx._1_n_tab.Address1ntab" table="ADDRESS_1ntab">

??????? <id name="addressid">

?? ?????????<generator class="identity"/>

??????? </id>

??????? <property name="addressdetail"/>

??? </class>

</hibernate-mapping>

?

?

六、測試方法

?

public class Test_1ntab {

??? public static void main(String[] args){

??????? Address1ntab add1=new Address1ntab();

??????? Address1ntab add2=new Address1ntab();

??????? Address1ntab add3=new Address1ntab();

??????? Person1ntab p1=new Person1ntab();

??????? Person1ntab p2=new Person1ntab();

?

??????? add1.setAddressdetail("鄭州市經(jīng)三路");

??????? add2.setAddressdetail("合肥市宿州路");

??????? add3.setAddressdetail("北京市長安路");

??????? p1.setName("wang");

??????? p1.setAge(30);

??????? p2.setName("lee");

??????? p2.setAge(50);

?

??????? p1.getAddresses().add(add1);

??????? p1.getAddresses().add(add2);

??????? //p2.getAddresses().add(add2);

??????? p2.getAddresses().add(add3);

?

??????? Session session= HibernateUtil.getCurrentSession();

??????? Transaction tx=session.beginTransaction();

??????? session.save(add1);

??????? session.save(add2);

??????? session.save(add3);

??????? session.save(p1);

??????? session.save(p2);

??????? tx.commit();

??????? HibernateUtil.closeSession();

??? }

}

?

七、測試結(jié)果

?

1) :正常保存.

??????? session.save(add1);

??????? session.save(add2);

??????? session.save(add3);

??????? session.save(p1);

??????? session.save(p2);

Hibernate: insert into PERSON_1nfk (name, age) values (?, ?)

Hibernate: insert into ADDRESS_1nfk (addressdetail) values (?)

Hibernate: insert into ADDRESS_1nfk (addressdetail) values (?)

Hibernate: update ADDRESS_1nfk set personid=? where addressid=?

Hibernate: update ADDRESS_1nfk set personid=? where addressid=?

?

==================================

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

?

一、模型介紹

?

多個人(Person)對應(yīng)一個地址(Address)。

?

二、實體(省略getter、setter方法)

?

public class Personn1fk {

??? private int personid;

??? private String name;

??? private int age;

??? private Addressn1fk addressn1fk;

?

public class Addressn1fk {

??? private int addressid;

??? private String addressdetail;

?

三、表模型

?

mysql> desc address_n1kf;

+---------------+--------------+------+-----+---------+----------------+

| Field???????? | Type???????? | Null | Key | Default | Extra????????? |

+---------------+--------------+------+-----+---------+----------------+

| addressid???? | int(11)????? | NO?? | PRI | NULL??? | auto_increment |

| addressdetail | varchar(255) | YES? |???? | NULL??? |??? ????????????|

+---------------+--------------+------+-----+---------+----------------+

?

mysql> desc person_n1kf;

+-----------+--------------+------+-----+---------+----------------+

| Field???? | Type???????? | Null | Key | Default | Extra?? ???????|

+-----------+--------------+------+-----+---------+----------------+

| personid? | int(11)????? | NO?? | PRI | NULL??? | auto_increment |

| name????? | varchar(255) | YES? |???? | NULL??? |??????????????? |

| age?????? | int(11)????? | YES? |???? | NULL??? |??????????????? |

| addressId | int(11)????? | YES? | MUL | NULL??? |??????????????? |

+-----------+--------------+------+-----+---------+----------------+

?

四、生成的SQL腳本

?

CREATE TABLE `address_n1kf` (

? `addressid` int(11) NOT NULL auto_increment,

? `addressdetail` varchar(255) default NULL,

? PRIMARY KEY? (`addressid`)

) ENGINE=InnoDB DEFAULT CHARSET=gbk;

?

DROP TABLE IF EXISTS `person_n1kf`;

?

CREATE TABLE `person_n1kf` (

? `personid` int(11) NOT NULL auto_increment,

? `name` varchar(255) default NULL,

? `age` int(11) default NULL,

? `addressId` int(11) default NULL,

? PRIMARY KEY? (`personid`),

? KEY `FK4571AF54A2A3EE48` (`addressId`),

? CONSTRAINT `FK4571AF54A2A3EE48` FOREIGN KEY (`addressId`) REFERENCES `address_n1kf` (`addressid`)

) ENGINE=InnoDB DEFAULT CHARSET=gbk;

?

?

五、映射方法

?

<hibernate-mapping>

??? <class name="com.lavasoft.dx._n_1_fk.Personn1fk" table="PERSON_n1fk">

??????? <id name="personid">

??????????? <generator class="identity"/>

??????? </id>

??????? <property name="name"/>

??????? <property name="age"/>

??????? <!--用來映射關(guān)聯(lián)PO column是Address在該表中的外鍵列名-->

??????? <many-to-one name="addressn1fk" column="addressId"/>

??? </class>

</hibernate-mapping>

?

<hibernate-mapping>

??? <class name="com.lavasoft.dx._n_1_fk.Addressn1fk" table="ADDRESS_n1fk">

??????? <id name="addressid">

??????????? <generator class="identity"/>

?????? ?</id>

??????? <property name="addressdetail"/>

??? </class>

</hibernate-mapping>

?

?

六、測試方法

?

public class Test_n1fk {

??? public static void main(String[] args){

??????? Personn1fk p1=new Personn1fk();

??????? Personn1fk p2=new Personn1fk();

?

??????? p1.setAge(21);

??????? p1.setName("p1");

?

??????? p2.setAge(23);

??????? p2.setName("p2");

?

??????? Addressn1fk add=new Addressn1fk();

??????? add.setAddressdetail("鄭州市經(jīng)三路");

?

??????? p1.setAddressn1fk(add);

??????? p2.setAddressn1fk(add);

?

??????? Session session=HibernateUtil.getCurrentSession();

??????? Transaction tx=session.beginTransaction();

??????? session.save(add);

??????? session.save(p1);

??????? session.save(p2);

??????? tx.commit();

??????? HibernateUtil.closeSession();

??? }

}

?

七、測試結(jié)果

?

1) :正常保存. 推薦這么干!

?

??????? session.save(p1);

??????? session.save(p2);

?

Hibernate: insert into ADDRESS_n1kf (addressdetail) values (?)

Hibernate: insert into PERSON_n1kf (name, age, addressId) values (?, ?, ?)

Hibernate: insert into PERSON_n1kf (name, age, addressId) values (?, ?, ?)

?

2) :正常保存.

??????? session.save(p1);

??????? session.save(p2);

??????? session.save(add);

?

Hibernate: insert into PERSON_n1kf (name, age, addressId) values (?, ?, ?)

Hibernate: insert into PERSON_n1kf (name, age, addressId) values (?, ?, ?)

Hibernate: insert into ADDRESS_n1kf (addressdetail) values (?)

Hibernate: update PERSON_n1kf set name=?, age=?, addressId=? where personid=?

Hibernate: update PERSON_n1kf set name=?, age=?, addressId=? where personid=?

?

3) :正常保存.

??????? session.save(add);

//??????? session.save(p1);

//??????? session.save(p2);

?

Hibernate: insert into ADDRESS_n1kf (addressdetail) values (?)

?

4) : 發(fā)生異常,不能保存.

//??????? session.save(add);

??????? session.save(p1);

??????? session.save(p2);

Hibernate: insert into PERSON_n1kf (name, age, addressId) values (?, ?, ?)

Hibernate: insert into PERSON_n1kf (name, age, addressId) values (?, ?, ?)

Exception in thread "main" org.hibernate.TransientObjectException: com.lavasoft.dx._n_1_fk.Addressn1kf

?

?

?

===========================

Hibernate 多對一連接表單向關(guān)聯(lián)

?

一、模型介紹

?

多個人(Person)對應(yīng)一個地址(Address)。

?

二、實體(省略getter、setter方法)

?

public class Personn1tab {

??? private int personid;

??? private String name;

??? private int age;

??? private Addressn1tab addressn1tab;

?

public class Addressn1tab {

??? private int addressid;

??? private String addressdetail;

?

三、表模型

?

mysql> desc address_n1tab;

+---------------+--------------+------+-----+---------+----------------+

| Field???????? | Type???????? | Null | Key | Default | Extra????????? |

+---------------+--------------+------+-----+---------+----------------+

| addressid???? | int(11)????? | NO?? | PRI | NULL??? | auto_increment |

| addressdetail | varchar(255) | YES? |???? | NULL??? |??????????????? |

+---------------+--------------+------+-----+---------+----------------+

?

mysql> desc join_n1tab;

+------------+---------+------+-----+---------+-------+

| Field????? | Type??? | Null | Key | Default | Extra |

+------------+---------+------+-----+---------+-------+

| personid?? | int(11) | NO?? | PRI |???????? |?????? |

| addressn1tab | int(11) | YES? | MUL | NULL??? |?????? |

+------------+---------+------+-----+---------+-------+

?

mysql> desc person_n1tab;

+----------+--------------+------+-----+---------+----------------+

| Field??? | Type???????? | Null | Key | Default | Extra????????? |

+----------+--------------+------+-----+---------+----------------+

| personid | int(11)????? | NO?? | PRI | NULL??? | auto_increment |

| name???? | varchar(255) | YES? |???? | NULL??? |??????????????? |

| age????? | int(11)????? | YES? |???? | NULL??? |??????????????? |

+----------+--------------+------+-----+---------+----------------+

?

四、生成的SQL腳本

?

CREATE TABLE `address_n1tab` (

? `addressid` int(11) NOT NULL auto_increment,

? `addressdetail` varchar(255) default NULL,

? PRIMARY KEY? (`addressid`)

) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=gbk;

?

CREATE TABLE `join_n1tab` (

? `personid` int(11) NOT NULL,

? `address11fk` int(11) default NULL,

? PRIMARY KEY? (`personid`),

? KEY `FKAC780AAADAE3A82C` (`personid`),

? KEY `FKAC780AAAC6242A64` (`address11fk`),

? CONSTRAINT `FKAC780AAAC6242A64` FOREIGN KEY (`address11fk`) REFERENCES `address_n1tab` (`addressid`),

? CONSTRAINT `FKAC780AAADAE3A82C` FOREIGN KEY (`personid`) REFERENCES `person_n1tab` (`personid`)

) ENGINE=InnoDB DEFAULT CHARSET=gbk;

?

CREATE TABLE `person_n1tab` (

? `personid` int(11) NOT NULL auto_increment,

? `name` varchar(255) default NULL,

? `age` int(11) default NULL,

? PRIMARY KEY? (`personid`)

) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=gbk;

?

?

五、映射方法

?

<hibernate-mapping>

??? <class name="com.lavasoft.dx._n_1_tab.Personn1tab" table="PERSON_n1tab">

??????? <id name="personid">

??????????? <generator class="identity"/>

??????? </id>

??????? <property name="name"/>

??????? <property name="age"/>

??????? <!--使用join元素顯式確定鏈接表-->

??????? <join table="join_n1tab">

??????????? <!--映射關(guān)聯(lián)所用的外鍵-->

??????????? <key column="personid"/>

??????????? <many-to-one name="addressn1tab"/>

??????? </join>

??? </class>

</hibernate-mapping>

?

<hibernate-mapping>

??? <class name="com.lavasoft.dx._n_1_tab.Addressn1tab" table="ADDRESS_n1tab">

??????? <id name="addressid">

??????????? <generator class="identity"/>

??????? </id>

??????? <property name="addressdetail"/>

??? </class>

</hibernate-mapping>

?

?

六、測試方法

?

public class Test_n1tab {

??? public static void main(String[] args){

??????? Personn1tab p1=new Personn1tab();

??????? Personn1tab p2=new Personn1tab();

?

??????? p1.setAge(21);

??????? p1.setName("p1");

?

??????? p2.setAge(23);

??????? p2.setName("p2");

?

??????? Addressn1tab add=new Addressn1tab();

??????? add.setAddressdetail("鄭州市經(jīng)三路");

?

??????? p1.setAddressn1tab(add);

??????? p2.setAddressn1tab(add);

?

??????? Session session=HibernateUtil.getCurrentSession();

??????? Transaction tx=session.beginTransaction();

??????? session.save(add);

??????? session.save(p1);

??????? session.save(p2);

??????? tx.commit();

??????? HibernateUtil.closeSession();

??? }

}

?

七、測試結(jié)果

?

1) :正常保存. 推薦這么干!

?

??????? session.save(p1);

??????? session.save(p2);

?

Hibernate: insert into ADDRESS_n1tab (addressdetail) values (?)

Hibernate: insert into PERSON_n1tab (name, age) values (?, ?)

Hibernate: insert into join_n1tab (address11fk, personid) values (?, ?)

Hibernate: insert into PERSON_n1tab (name, age) values (?, ?)

Hibernate: insert into join_n1tab (address11fk, personid) values (?, ?)

?

2) :正常保存.

??????? session.save(p1);

??????? session.save(p2);

??????? session.save(add);

?

?Hibernate: insert into PERSON_n1tab (name, age) values (?, ?)

?Hibernate: insert into join_n1tab (address11fk, personid) values (?, ?)

?Hibernate: insert into PERSON_n1tab (name, age) values (?, ?)

?Hibernate: insert into join_n1tab (address11fk, personid) values (?, ?)

?

?

?

====================

Hibernate 多對多單向關(guān)聯(lián)

?

一、模型介紹

?

多個人(Person)對應(yīng)多個地址(Address)。

一個人可對應(yīng)多個地址,一個地址也可以對應(yīng)多個人。?

二、實體(省略getter、setter方法)

?

public class Personnn {

??? private int personid;

??? private String name;

??? private int age;

??? private Set addresses=new HashSet();

?

public class Addressnn {

??? private int addressid;

??? private String addressdetail;

?

三、表模型

?

mysql> desc person_nn;

+----------+--------------+------+-----+---------+----------------+

| Field??? | Type???????? | Null | Key | Default | Extra????????? |

+----------+--------------+------+-----+---------+----------------+

| personid | int(11)????? | NO?? | PRI | NULL??? | auto_increment |

| name???? | varchar(255) | YES? |???? | NULL??? |??????????????? |

| age????? | int(11)????? | YES? |???? | NULL??? |??????????????? |

+----------+--------------+------+-----+---------+----------------+

?

mysql> desc join_nn;

+-----------+---------+------+-----+---------+-------+

| Field???? | Type??? | Null | Key | Default | Extra |

+-----------+---------+------+-----+---------+-------+

| personid? | int(11) | NO?? | PRI |???????? |?????? |

| addressid | int(11) | NO?? | PRI |???????? |?????? |

+-----------+---------+------+-----+---------+-------+

?

mysql> desc person_nn;

+----------+--------------+------+-----+---------+----------------+

| Field??? | Type???????? | Null | Key | Default | Extra????????? |

+----------+--------------+------+-----+---------+----------------+

| personid | int(11)??? ??| NO?? | PRI | NULL??? | auto_increment |

| name???? | varchar(255) | YES? |???? | NULL??? |??????????????? |

| age????? | int(11)????? | YES? |???? | NULL??? |??????????????? |

+----------+--------------+------+-----+---------+----------------+

?

四、生成的SQL腳本

?

/* Formatted on 2007/08/21 11:13 (QP5 v5.50) */

CREATE TABLE `address_nn` (

? `addressid` int(11) NOT NULL auto_increment,

? `addressdetail` varchar(255) default NULL,

? PRIMARY KEY? (`addressid`)

) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=gbk;

?

/* Formatted on 2007/08/21 11:14 (QP5 v5.50) */

CREATE TABLE `join_nn` (

? `personid` int(11) NOT NULL,

? `addressid` int(11) NOT NULL,

? PRIMARY KEY? (`personid`,`addressid`),

? KEY `FKAAB98CF5E008E752` (`personid`),

? KEY `FKAAB98CF5239F6A16` (`addressid`),

? CONSTRAINT `FKAAB98CF5239F6A16` FOREIGN KEY (`addressid`) REFERENCES `address_nn` (`addressid`),

? CONSTRAINT `FKAAB98CF5E008E752` FOREIGN KEY (`personid`) REFERENCES `person_nn` (`personid`)

) ENGINE=InnoDB DEFAULT CHARSET=gbk;

?

/* Formatted on 2007/08/21 11:14 (QP5 v5.50) */

CREATE TABLE `person_nn` (

? `personid` int(11) NOT NULL auto_increment,

? `name` varchar(255) default NULL,

? `age` int(11) default NULL,

? PRIMARY KEY? (`personid`)

) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=gbk;

?

五、映射方法

?

<hibernate-mapping>

??? <class name="com.lavasoft.dx._n_n.Personnn" table="PERSON_nn">

??????? <id name="personid">

??????????? <generator class="identity"/>

??????? </id>

??????? <property name="name"/>

??????? <property name="age"/>

??????? <!--映射集合屬性,join_1ntab是連接表表名-->

??????? <set name="addresses"

???????????? table="join_nn"

????????????? ??>

??????????? <!--“column="personid"”確定PERSON_1ntab表關(guān)聯(lián)到連接表的外鍵列名-->

??????????? <key column="personid"/>

??????????? <!--“column="addressid"”關(guān)聯(lián)PERSON_1ntab表的Address1ntab對象的id在連接表中的列名-->

??????????? <many-to-many

??????????????????? column="addressid"

??????????????????? class="com.lavasoft.dx._n_n.Addressnn"/>

??????? </set>

??? </class>

</hibernate-mapping>

?

<hibernate-mapping>

??? <class name="com.lavasoft.dx._n_n.Addressnn" table="ADDRESS_nn">

??????? <id name="addressid">

??????????? <generator class="identity"/>

??????? </id>

??????? <property name="addressdetail"/>

??? </class>

</hibernate-mapping>

?

?

六、測試方法

?

public class Test_nn {

??? public static void main(String[] args){

?? ?????Addressnn add1=new Addressnn();

??????? Addressnn add2=new Addressnn();

??????? Addressnn add3=new Addressnn();

??????? Personnn p1=new Personnn();

??????? Personnn p2=new Personnn();

?

??????? add1.setAddressdetail("鄭州市經(jīng)三路");

???? ???add2.setAddressdetail("合肥市宿州路");

??????? add3.setAddressdetail("北京市長安路");

??????? p1.setName("wang");

??????? p1.setAge(30);

??????? p2.setName("lee");

??????? p2.setAge(50);

?

??????? p1.getAddresses().add(add1);

??????? p1.getAddresses().add(add2);

??????? p2.getAddresses().add(add2);

??????? p2.getAddresses().add(add3);

?

??????? Session session= HibernateUtil.getCurrentSession();

??????? Transaction tx=session.beginTransaction();

??????? session.save(add1);

??????? session.save(add2);

??????? session.save(add3);

??????? session.save(p1);

??????? session.save(p2);

??????? tx.commit();

??????? HibernateUtil.closeSession();

??? }

}

?

七、測試結(jié)果

?

1) :正常保存.

???? ???session.save(add1);

??????? session.save(add2);

??????? session.save(add3);

??????? session.save(p1);

??????? session.save(p2);

?

Hibernate: insert into ADDRESS_nn (addressdetail) values (?)

Hibernate: insert into ADDRESS_nn (addressdetail) values (?)

Hibernate: insert into ADDRESS_nn (addressdetail) values (?)

Hibernate: insert into PERSON_nn (name, age) values (?, ?)

Hibernate: insert into PERSON_nn (name, age) values (?, ?)

Hibernate: insert into join_nn (personid, addressid) values (?, ?)

Hibernate: insert into join_nn (personid, addressid) values (?, ?)

Hibernate: insert into join_nn (personid, addressid) values (?, ?)

Hibernate: insert into join_nn (personid, addressid) values (?, ?)

?

=========================

Hibernate 一對一外鍵雙向關(guān)聯(lián) 一對一外鍵關(guān)聯(lián)是一對多外鍵關(guān)聯(lián)的特例,只是在多的一方加了個唯一性約束。 一、模型 一個人對應(yīng)一個地址。 /*==============================================================*/
/* DBMS name:????? MySQL 5.0??????????????????????????????????? */
/* Created on:???? 2008-12-9 0:12:54??????????????????????????? */
/*==============================================================*/
drop table if exists address; drop table if exists person; /*==============================================================*/
/* Table: address?????????????????????????????????????????????? */
/*==============================================================*/
create table address
(
?? id?????????????????? bigint not null auto_increment comment 'ID',
?? detail?????????????? varchar(120) not null comment '詳細地址',
?? personid???????????? bigint comment '人的ID',
?? primary key (id)
)
type = InnoDB; alter table address comment '地址'; /*==============================================================*/
/* Table: person??????????????????????????????????????????????? */
/*==============================================================*/
create table person
(
?? id?????????????????? bigint not null auto_increment comment 'ID',
?? name???????????????? varchar(24) not null comment '姓名',
?? primary key (id)
)
type = InnoDB; alter table person comment '人'; alter table address add constraint FK_Reference_4 foreign key (personid)
????? references person (id) on delete restrict on update restrict; 二、對象模型 public class Person implements java.io.Serializable {

??private Long id;
??private String name;
??private Address address; public class Address implements java.io.Serializable {
??private Long id;
??private Person person;
??private String detail; 三、映射文件 <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
??<class name="entity.Person" table="person">
????<id name="id" type="java.lang.Long">
??????<column name="id" />
??????<generator class="identity" />
????</id>
????<property name="name" type="java.lang.String">
??????<column name="name" length="24" not-null="true">
????????<comment>姓名</comment>
??????</column>
????</property>
????<one-to-one name="address" cascade="all" />
??</class>
</hibernate-mapping> <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
??<class name="entity.Address" table="address" catalog="testdb">
????<id name="id" type="java.lang.Long">
??????<column name="id" />
??????<generator class="identity" />
????</id>
????<property name="detail" type="java.lang.String">
??????<column name="detail" length="120" not-null="true">
????????<comment>詳細地址</comment>
??????</column>
????</property>
????<many-to-one name="person" class="entity.Person"
??????fetch="select" unique="true">
??????<column name="personid">
????????<comment>人的ID</comment>
??????</column>
????</many-to-one>
??</class>
</hibernate-mapping> <?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
????????????????????"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
????????????????????"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools.???????????????????????????????????? -->
<hibernate-configuration>

??<session-factory>
????<property name="connection.username">root</property>
????<property name="connection.url">
??????jdbc:mysql://localhost:3306/testdb
????</property>
????<property name="dialect">
??????org.hibernate.dialect.MySQLDialect
????</property>
????<property name="connection.password">xiaohui</property>
????<property name="connection.driver_class">
??????com.mysql.jdbc.Driver
????</property>
????<property name="show_sql">true</property>
????<property name="format_sql">true</property>
????<mapping resource="entity/Person.hbm.xml" />
????<mapping resource="entity/Address.hbm.xml" />

??</session-factory>

</hibernate-configuration> 四、測試 import org.hibernate.Transaction;

import entity.Address;
import entity.Person;

import utils.HibernateSessionFactory;

public class Test {
??public static void main(String[] args) {
????savePerson();
??}

??public static void savePerson() {
????Person person = new Person("張三");
????Address address = new Address("XX街X號");
????person.setAddress(address);
????address.setPerson(person);

????Session session = HibernateSessionFactory.getSession();
????Transaction tx = session.beginTransaction();
????session.save(person);
????tx.commit();
??}
} 運行日志: Hibernate:????
????????insert????
????????into
????????????????person
????????????????(name)????
????????values
????????????????(?)
Hibernate:????
????????insert????
????????into
????????????????testdb.address
????????????????(detail, personid)????
????????values
????????????????(?, ?)

?

======================

Hibernate 一對一主鍵雙向關(guān)聯(lián) 一對一主鍵映射在一對一映射中還算是最為常用的。 一、模型 一個人Person 對應(yīng)一個地址Address。 二、數(shù)據(jù)模型和對象模型圖 導(dǎo)出建表SQL如下: /*==============================================================*/
/* DBMS name:????????????MySQL 5.0????????????????????????????????????????????????????????????????????????*/
/* Created on:???????? 2008-12-8 23:05:32???????????????????????????????????????????????????? */
/*==============================================================*/


drop table if exists address;

drop table if exists person;

/*==============================================================*/
/* Table: address???????????????????????????????????????????????????????????????????????????????????????????? */
/*==============================================================*/
create table address
(
???? id???????????????????????????????????? bigint not null comment 'ID',
???? detail???????????????????????????? varchar(120) not null comment '詳細地址',
???? primary key (id)
)
type = InnoDB;

alter table address comment '地址';

/*==============================================================*/
/* Table: person????????????????????????????????????????????????????????????????????????????????????????????????*/
/*==============================================================*/
create table person
(
???? id???????????????????????????????????? bigint not null auto_increment comment 'ID',
???? name???????????????????????????????? varchar(24) not null comment '姓名',
???? primary key (id)
)
type = InnoDB;

alter table person comment '人';

alter table address add constraint FK_Reference_2 foreign key (id)
????????????references person (id) on delete restrict on update restrict; 三、對象模型代碼 public class Person implements java.io.Serializable {

??private Long id;
??private String name;
??private Address address; public class Address implements java.io.Serializable {
??private Long id;
??private Person person;
??private String detail; 四、映射代碼 <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
??<class name="entity.Person" table="person">
????<id name="id" type="java.lang.Long">
??????<column name="id" />
??????<generator class="identity" />
????</id>
????<property name="name" type="java.lang.String">
??????<column name="name" length="24" not-null="true">
????????<comment>姓名</comment>
??????</column>
????</property>
????<!-- cascade="all":在保存person對象的時候,級聯(lián)保存person對象關(guān)聯(lián)的address對象????-->
????<one-to-one name="address" cascade="all" />
??</class>
</hibernate-mapping> <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
??<class name="entity.Address" table="address" catalog="mydb">
????<id name="id" type="java.lang.Long">
??????<column name="id" />
??????<!-- class="foreign": 一對一主鍵映射中,使用另外一個相關(guān)聯(lián)的對象的標識符 -->
??????<generator class="foreign">
????????<param name="property">person</param>
??????</generator>
????</id>
????<property name="detail" type="java.lang.String">
??????<column name="detail" length="120" not-null="true">
????????<comment>詳細地址</comment>
??????</column>
????</property>
????<!-- 表示在address表存在一個外鍵約束,外鍵參考相關(guān)聯(lián)的表person -->
????<one-to-one name="person" constrained="true" />
??</class>
</hibernate-mapping> 五、Hibernate配置 <?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
????????????????????"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
????????????????????"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools.???????????????????????????????????? -->
<hibernate-configuration>

<session-factory>
??<property name="connection.username">root</property>
??<property name="connection.url">
????jdbc:mysql://localhost:3306/mydb
??</property>
??<property name="dialect">
????org.hibernate.dialect.MySQLDialect
??</property>
??<property name="connection.password">xiaohui</property>
??<property name="connection.driver_class">
????com.mysql.jdbc.Driver
??</property>
??<property name="show_sql">true</property>
??<property name="format_sql">true</property>
??<mapping resource="entity/Person.hbm.xml" />
??<mapping resource="entity/Address.hbm.xml" />

</session-factory>

</hibernate-configuration> 測試很簡單就不寫了。

?

====================

Hibernate 一對一連接表雙向關(guān)聯(lián)

?

一、模型介紹

?

一個人(Person)對應(yīng)一個地址(Address)。

?

二、實體(省略getter、setter方法)

?

public class Person11tab_sx {

??? private int personid;

??? private String name;

??? private int age;

??? private Address11tab_sx address11tab_sx;

?

public class Address11tab_sx {

??? private int addressid;

??? private String addressdetail;

??? private Person11tab_sx person11tab_sx;

?

三、表模型

?

mysql> desc person_11tab_sx;

+----------+--------------+------+-----+---------+----------------+

| Field??? | Type???????? | Null | Key | Default | Extra????????? |

+----------+--------------+------+-----+---------+----------------+

| personid | int(11)????? | NO?? | PRI | NULL??? | auto_increment |

| name???? | varchar(255) | YES? |???? | NULL??? |??????????????? |

| age????? | int(11)????? | YES? |???? | NULL??? |??????????????? |

+----------+--------------+------+-----+---------+----------------+

?

mysql> desc join_11tab_sx;

+-----------+---------+------+-----+---------+-------+

| Field???? | Type??? | Null | Key | Default | Extra |

+-----------+---------+------+-----+---------+-------+

| addressid | int(11) | NO?? | UNI |???????? |?????? |

| personid? | int(11) | NO?? | PRI |???????? |?????? |

+-----------+---------+------+-----+---------+-------+

?

mysql> desc address_11tab_sx;

+---------------+--------------+------+-----+---------+----------------+

| Field???????? | Type???????? | Null | Key | Default | Extra????????? |

+---------------+--------------+------+-----+---------+----------------+

| addressid???? | int(11)????? | NO?? | PRI | NULL??? | auto_increment |

| addressdetail | varchar(255) | YES? |???? | NULL??? |??????????????? |

+---------------+--------------+------+-----+---------+----------------+

?

四、生成的SQL腳本

?

/* Formatted on 2007/08/22 17:35 (QP5 v5.50) */

CREATE TABLE `person_11tab_sx` (

? `personid` int(11) NOT NULL auto_increment,

? `name` varchar(255) default NULL,

? `age` int(11) default NULL,

? PRIMARY KEY? (`personid`)

) ENGINE=InnoDB DEFAULT CHARSET=gbk;

?

/* Formatted on 2007/08/22 17:34 (QP5 v5.50) */

CREATE TABLE `address_11tab_sx` (

? `addressid` int(11) NOT NULL auto_increment,

? `addressdetail` varchar(255) default NULL,

? PRIMARY KEY? (`addressid`)

) ENGINE=InnoDB DEFAULT CHARSET=gbk;

?

/* Formatted on 2007/08/22 18:35 (QP5 v5.50) */
CREATE TABLE `join_11tab_sx` (
? `addressid` int(11) NOT NULL,
? `personid` int(11) NOT NULL,
? PRIMARY KEY? (`personid`),
? UNIQUE KEY `addressid` (`addressid`),
? UNIQUE KEY `personid` (`personid`),
? KEY `FKF4AA80E44327AAB6` (`personid`),
? KEY `FKF4AA80E460C0C9F0` (`addressid`),
? CONSTRAINT `FKF4AA80E460C0C9F0` FOREIGN KEY (`addressid`) REFERENCES `address_11tab_sx` (`addressid`),
? CONSTRAINT `FKF4AA80E44327AAB6` FOREIGN KEY (`personid`) REFERENCES `person_11tab_sx` (`personid`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;

?

?

?

五、映射方法

?

<hibernate-mapping>

??? <class name="com.lavasoft.sx._1_1_tab.Person11tab_sx" table="PERSON_11tab_sx">

??????? <id name="personid">

??????????? <generator class="identity"/>

??????? </id>

??????? <property name="name"/>

??????? <property name="age"/>

??????? <join table="join_11tab_sx"

????????????? optional="true">

??????????? <key column="personid"

???????????????? unique="true"/>

??????????? <many-to-one name="address11tab_sx"

???????????????????????? column="addressid"

???????????????????????? not-null="true"

???????????????????????? unique="true"/>

??????? </join>

??? </class>

</hibernate-mapping>

?

<hibernate-mapping>

??? <class name="com.lavasoft.sx._1_1_tab.Address11tab_sx" table="ADDRESS_11tab_sx">

??????? <id name="addressid">

??????????? <generator class="identity"/>

??????? </id>

??????? <property name="addressdetail"/>

??????? <join table="join_11tab_sx"

????????????? optional="true"

????????????? inverse="true">

??????????? <key column="addressid"

???????????????? unique="true"/>

??????????? <many-to-one name="person11tab_sx" column="personid"

???????????????????????? not-null="true" unique="true"/>

??????? </join>

??? </class>

</hibernate-mapping>

?

六、測試方法

?

public class Test_11tab_sx {

??? public static void main(String[] args){

??????? Address11tab_sx add = new Address11tab_sx();

??????? Person11tab_sx p = new Person11tab_sx();

?

??????? add.setAddressdetail("鄭州市經(jīng)三路");

??????? p.setAge(12);

??????? p.setName("wudalang");

?

??????? add.setPerson11tab_sx(p);

??????? p.setAddress11tab_sx(add);

?

??????? Session session = HibernateUtil.getCurrentSession();

??????? Transaction tx = session.beginTransaction();

??????? session.saveOrUpdate(p);

??????? session.saveOrUpdate(add);

??????? tx.commit();

??????? HibernateUtil.closeSession();

??? }

}

?

七、測試結(jié)果

?

1) :正常保存.

??????? session.saveOrUpdate(p);

??????? session.saveOrUpdate(add);

?

Hibernate: insert into PERSON_11tab_sx (name, age) values (?, ?)

Hibernate: insert into ADDRESS_11tab_sx (addressdetail) values (?)

Hibernate: insert into join_11tab_sx (addressid, personid) values (?, ?)

?

======================

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

?

一、模型介紹

?

一個人(Person)對應(yīng)多個地址(Address)。

?

二、實體(省略getter、setter方法)

?

public class Person1nfk_sx implements Serializable {

??? private int personid;

??? private String name;

??? private int age;

??? private Set addresses=new HashSet();

?

public class Address1nfk_sx implements Serializable {

??? private int addressid;

??? private String addressdetail;

??? private Person1nfk_sx person1nfkSx;

?

三、表模型

?

mysql> desc person_1nfk_sx;

+----------+--------------+------+-----+---------+----------------+

| Field??? | Type???????? | Null | Key | Default | Extra????????? |

+----------+--------------+------+-----+---------+----------------+

| personid | int(11)????? | NO?? | PRI | NULL??? | auto_increment |

| name???? | varchar(255) | YES? |???? | NULL??? |??????????????? |

| age????? | int(11)????? | YES? |???? | NULL??? |??????????????? |

+----------+--------------+------+-----+---------+----------------+

?

mysql> desc address_1nfk_sx;

+---------------+--------------+------+-----+---------+----------------+

| Field???????? | Type???????? | Null | Key | Default | Extra????????? |

+---------------+--------------+------+-----+---------+----------------+

| addressid???? | int(11)????? | NO?? | PRI | NULL??? | auto_increment |

| addressdetail | varchar(255) | YES? |???? | NULL??? |??????????????? |

| personid????? | int(11)????? | NO?? | MUL |???????? |??????????????? |

+---------------+--------------+------+-----+---------+----------------+

?

四、生成的SQL腳本

?

? /* Formatted on 2007/08/22 17:42 (QP5 v5.50) */

? CREATE TABLE `address_1nfk` (

??? `addressid` int(11) NOT NULL auto_increment,

??? `addressdetail` varchar(255) default NULL,

??? `personid` int(11) default NULL,

??? PRIMARY KEY? (`addressid`),

??? KEY `FK9B93456DA6D6C1F5` (`personid`),

??? CONSTRAINT `FK9B93456DA6D6C1F5` FOREIGN KEY (`personid`) REFERENCES `person_1nfk` (`personid`)

? ) ENGINE=InnoDB DEFAULT CHARSET=gbk;

?

?

? /* Formatted on 2007/08/22 17:42 (QP5 v5.50) */

? CREATE TABLE `person_1nfk` (

??? `personid` int(11) NOT NULL auto_increment,

??? `name` varchar(255) default NULL,

??? `age` int(11) default NULL,

??? PRIMARY KEY? (`personid`)

? ) ENGINE=InnoDB DEFAULT CHARSET=gbk;

?

五、映射方法

?

<hibernate-mapping>

??? <class name="com.lavasoft.sx._1_n_fk.Person1nfk_sx" table="PERSON_1nfk_sx">

??????? <id name="personid">

??????????? <generator class="identity"/>

??????? </id>

??????? <property name="name"/>

??????? <property name="age"/>

??????? <!--映射集合屬性,關(guān)聯(lián)到持久化類-->

??????? <set name="addresses" inverse="true" cascade="all">

??????????? <!--column用于指定外鍵列名-->

??????????? <key column="personid" not-null="true"/>

??????????? <!--映射關(guān)聯(lián)類-->

??????????? <one-to-many class="com.lavasoft.sx._1_n_fk.Address1nfk_sx"/>

??????? </set>

??? </class>

</hibernate-mapping>

?

<hibernate-mapping>

??? <class name="com.lavasoft.sx._1_n_fk.Address1nfk_sx" table="ADDRESS_1nfk_sx">

??????? <id name="addressid">

??????????? <generator class="identity"/>

??????? </id>

??????? <property name="addressdetail"/>

??????? <!--映射關(guān)聯(lián)屬性,column屬性指定外鍵列名-->

??????? <many-to-one name="person1nfk"

???????????????????? class="com.lavasoft.sx._1_n_fk.Person1nfk_sx"

???????????????????? fetch="select"

???????????????????? cascade="save-update">

??????????? <column name="personid" not-null="true"/>

??????? </many-to-one>

??? </class>

</hibernate-mapping>

?

六、測試方法

?

public class Test_1nfk_sx {

??? public static void main(String[] args){

??????? Address1nfk_sx add1=new Address1nfk_sx();

??????? Address1nfk_sx add2=new Address1nfk_sx();

??????? Person1nfk_sx p=new Person1nfk_sx();

?

??????? add1.setAddressdetail("鄭州市經(jīng)三路");

??????? add2.setAddressdetail("合肥市宿州路");

??????? p.setName("wang");

??????? p.setAge(30);

?

??????? p.getAddresses().add(add1);

??????? p.getAddresses().add(add2);

??????? add1.setPerson1nfk(p);

????? ??add2.setPerson1nfk(p);

?

??????? Session session= HibernateUtil.getCurrentSession();

??????? Transaction tx=session.beginTransaction();

??????? session.save(p);

??????? session.saveOrUpdate(add1);

??????? session.saveOrUpdate(add2);

? ??????tx.commit();

??????? HibernateUtil.closeSession();

??? }

}

?

七、測試結(jié)果

?

1) :正常保存.

??????? session.save(p);

??????? session.saveOrUpdate(add1);

??????? session.saveOrUpdate(add2);

?

Hibernate: insert into PERSON_1nfk_sx (name, age) values (?, ?)

Hibernate: insert into ADDRESS_1nfk_sx (addressdetail, personid) values (?, ?)

Hibernate: insert into ADDRESS_1nfk_sx (addressdetail, personid) values (?, ?)

?

=======================

Hibernate 一對多連接表雙向關(guān)聯(lián)

?

一、模型介紹

?

一個人(Person)對應(yīng)多個地址(Address)。

?

二、實體(省略getter、setter方法)

?

public class Person1ntab_sx {

??? private int personid;

??? private String name;

??? private int age;

??? private Set addresses=new HashSet();

?

public class Address1ntab_sx {

??? private int addressid;

??? private String addressdetail;

??? private Person1ntab_sx person1ntab_sx;

?

三、表模型

?

mysql> desc person_1ntab_sx;

+----------+--------------+------+-----+---------+----------------+

| Field??? | Type???????? | Null | Key | Default | Extra????????? |

+----------+--------------+------+-----+---------+----------------+

| personid | int(11)????? | NO?? | PRI | NULL??? | auto_increment |

| name???? | varchar(255) | YES? |???? | NULL??? |??????????????? |

| age????? | int(11)????? | YES? |???? | NULL??? |??????????????? |

+----------+--------------+------+-----+---------+----------------+

?

mysql> desc address_1ntab_sx;

+---------------+--------------+------+-----+---------+----------------+

| Field???????? | Type???????? | Null | Key | Default | Extra????????? |

+---------------+--------------+------+-----+---------+----------------+

| addressid???? | int(11)????? | NO?? | PRI | NULL??? | auto_increment |

| addressdetail | varchar(255) | YES? |???? | NULL??? |??????????????? |

+---------------+--------------+------+-----+---------+----------------+

?

mysql> desc join_1ntab_sx;

+-----------+---------+------+-----+---------+-------+

| Field???? | Type??? | Null | Key | Default | Extra |

+-----------+---------+------+-----+---------+-------+

| addressid | int(11) | NO?? | PRI |???????? |?????? |

| personid? | int(11) | NO?? | PRI |???????? |?????? |

+-----------+---------+------+-----+---------+-------+

?

四、生成的SQL腳本

?

/* Formatted on 2007/08/22 17:52 (QP5 v5.50) */

CREATE TABLE `address_1ntab_sx` (

? `addressid` int(11) NOT NULL auto_increment,

? `addressdetail` varchar(255) default NULL,

? PRIMARY KEY? (`addressid`)

) ENGINE=InnoDB DEFAULT CHARSET=gbk;

?

/* Formatted on 2007/08/22 17:52 (QP5 v5.50) */

CREATE TABLE `person_1ntab_sx` (

? `personid` int(11) NOT NULL auto_increment,

? `name` varchar(255) default NULL,

? `age` int(11) default NULL,

? PRIMARY KEY? (`personid`)

) ENGINE=InnoDB DEFAULT CHARSET=gbk;

?

/* Formatted on 2007/08/22 17:52 (QP5 v5.50) */

CREATE TABLE `join_1ntab_sx` (

? `addressid` int(11) NOT NULL,

? `personid` int(11) NOT NULL,

? PRIMARY KEY? (`personid`,`addressid`),

? KEY `FK8F869F61F93DDD6` (`personid`),

? KEY `FK8F869F61FC0F682A` (`addressid`),

? CONSTRAINT `FK8F869F61FC0F682A` FOREIGN KEY (`addressid`) REFERENCES `address_1ntab_sx` (`addressid`),

? CONSTRAINT `FK8F869F61F93DDD6` FOREIGN KEY (`personid`) REFERENCES `person_1ntab_sx` (`personid`)

) ENGINE=InnoDB DEFAULT CHARSET=gbk;

?

五、映射方法

?

<hibernate-mapping>

??? <class name="com.lavasoft.sx._1_n_tab.Person1ntab_sx" table="PERSON_1ntab_sx">

??????? <id name="personid">

??????????? <generator class="identity"/>

??????? </id>

??????? <property name="name"/>

??????? <property name="age"/>

??????? <!--映射集合屬性,關(guān)聯(lián)到持久化類-->

??????? <!--table="join_1ntab_sx"指定了連接表的名字-->

??????? <set name="addresses"

?????????? ??table="join_1ntab_sx"

???????????? cascade="all">

??????????? <!--column="personid"指定連接表中關(guān)聯(lián)當前實體類的列名-->

??????????? <key column="personid" not-null="true"/>

??????????? <!--unique="true"表示當前實體類是"1",不是"n"-->

??????????? <many-to-many column="addressid"

????????????????????????? unique="true"

????????????????????????? class="com.lavasoft.sx._1_n_tab.Address1ntab_sx"/>

??????? </set>

??? </class>

</hibernate-mapping>

?

<hibernate-mapping>

??? <class name="com.lavasoft.sx._1_n_tab.Address1ntab_sx"

?????????? table="ADDRESS_1ntab_sx">

??????? <id name="addressid">

??????????? <generator class="identity"/>

??????? </id>

??????? <property name="addressdetail"/>

??????? <!--映射關(guān)聯(lián)屬性,column屬性指定外鍵列名-->

??????? <join?? table="join_1ntab_sx"

??????????????? inverse="true"

????????????? optional="true">

??????????? <key column="addressid"/>

??????????? <many-to-one name="person1ntab_sx"

???????????????????????? column="personid"

???????????????????????? cascade="all"

???????????????????????? not-null="true"/>

??????? </join>

??? </class>

</hibernate-mapping>

?

六、測試方法

?

public class Test_1ntab_sx {

??? public static void main(String[] args){

??????? Address1ntab_sx add1=new Address1ntab_sx();

??????? Address1ntab_sx add2=new Address1ntab_sx();

??????? Person1ntab_sx p=new Person1ntab_sx();

?

??????? add1.setAddressdetail("鄭州市經(jīng)三路");

????? ??add2.setAddressdetail("合肥市宿州路");

??????? p.setName("wang");

??????? p.setAge(30);

?

??????? p.getAddresses().add(add1);

??????? p.getAddresses().add(add2);

??????? add1.setPerson1ntab_sx(p);

??????? add2.setPerson1ntab_sx(p);

?

?? ?????Session session= HibernateUtil.getCurrentSession();

??????? Transaction tx=session.beginTransaction();

//??????? session.save(p);

??????? session.saveOrUpdate(add1);

??????? session.saveOrUpdate(add2);

??????? tx.commit();

??????? HibernateUtil.closeSession();

??? }

}

?

七、測試結(jié)果

?

1) :正常保存.

//??????? session.save(p);

??????? session.saveOrUpdate(add1);

??????? session.saveOrUpdate(add2);

?

Hibernate: insert into PERSON_1ntab_sx (name, age) values (?, ?)

Hibernate: insert into ADDRESS_1ntab_sx (addressdetail) values (?)

Hibernate: insert into ADDRESS_1ntab_sx (addressdetail) values (?)

Hibernate: insert into join_1ntab_sx (personid, addressid) values (?, ?)

Hibernate: insert into join_1ntab_sx (personid, addressid) values (?, ?)

?

?

===========================

Hibernate 多對多雙向關(guān)聯(lián)
一、模型介紹
多個人(Person)對應(yīng)多個地址(Address)。 一個人可對應(yīng)多個地址,一個地址也可以對應(yīng)多個人。
二、實體(省略getter、setter方法)
?
public class Personnn_sx {
private int personid;
private String name;
private int age;
private Set addresses=new HashSet();
public class Addressnn_sx {
private int addressid;
private String addressdetail;
private Set persons = new HashSet();
?
三、表模型
mysql> desc person_nn_sx;
+----------+--------------+------+-----+---------+----------------+
| Field??? | Type???????? | Null | Key | Default | Extra????????? |
+----------+--------------+------+-----+---------+----------------+
| personid | int(11)????? | NO?? | PRI | NULL??? | auto_increment |
| name???? | varchar(255) | YES? |???? | NULL??? |??????????????? |
| age????? | int(11)????? | YES? |???? | NULL??? |??????????????? |
+----------+--------------+------+-----+---------+----------------+
mysql> desc address_nn_sx;
+---------------+--------------+------+-----+---------+----------------+
| Field???????? | Type???????? | Null | Key | Default | Extra????????? |
+---------------+--------------+------+-----+---------+----------------+
| addressid???? | int(11)????? | NO?? | PRI | NULL??? | auto_increment |
| addressdetail | varchar(255) | YES? |???? | NULL??? |??????????????? |
+---------------+--------------+------+-----+---------+----------------+
mysql> desc join_nn_sx;
+-----------+---------+------+-----+---------+-------+
| Field???? | Type??? | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+-------+
| addressid | int(11) | NO?? | PRI |???????? |?????? |
| personid? | int(11) | NO?? | PRI |???????? |?????? |
+-----------+---------+------+-----+---------+-------+
四、生成的SQL腳本
/* Formatted on 2007/08/22 17:59 (QP5 v5.50) */
CREATE TABLE `address_nn_sx` (
`addressid` int(11) NOT NULL auto_increment,
`addressdetail` varchar(255) default NULL,
PRIMARY KEY? (`addressid`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/* Formatted on 2007/08/22 17:59 (QP5 v5.50) */
CREATE TABLE `person_nn_sx` (
`personid` int(11) NOT NULL auto_increment,
`name` varchar(255) default NULL,
`age` int(11) default NULL,
PRIMARY KEY? (`personid`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/* Formatted on 2007/08/22 17:59 (QP5 v5.50) */
CREATE TABLE `join_nn_sx` (
`addressid` int(11) NOT NULL,
`personid` int(11) NOT NULL,
PRIMARY KEY? (`personid`,`addressid`),
KEY `FK6EBBC5EF6C600921` (`personid`),
KEY `FK6EBBC5EF2A92FF3D` (`addressid`),
CONSTRAINT `FK6EBBC5EF2A92FF3D` FOREIGN KEY (`addressid`) REFERENCES `address_nn_sx` (`addressid`),
CONSTRAINT `FK6EBBC5EF6C600921` FOREIGN KEY (`personid`) REFERENCES `person_nn_sx` (`personid`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
五、映射方法
?
<hibernate-mapping>
<class name="com.lavasoft.sx._n_n.Personnn_sx" table="PERSON_nn_sx">
<id name="personid">
<generator class="identity"/>
</id>
<property name="name"/>
<property name="age"/>
<!--映射集合屬性,關(guān)聯(lián)到持久化類-->
<!--table="join_1ntab_sx"指定了連接表的名字-->
<set name="addresses"
table="join_nn_sx"
cascade="all">
<!--column="personid"指定連接表中關(guān)聯(lián)當前實體類的列名-->
<key column="personid" not-null="true"/>
<!--column="addressid"是連接表中關(guān)聯(lián)本實體的外鍵-->
<many-to-many column="addressid"
class="com.lavasoft.sx._n_n.Addressnn_sx"/>
</set>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.lavasoft.sx._n_n.Addressnn_sx"
table="ADDRESS_nn_sx">
<id name="addressid">
<generator class="identity"/>
</id>
<property name="addressdetail"/>
<!--table="join_nn_sx"是雙向多對多的連接表-->
<set name="persons"
inverse="true"
table="join_nn_sx">
<!--column="addressid"是連接表中關(guān)聯(lián)本實體的外鍵-->
<key column="addressid"/>
<many-to-many column="personid"
class="com.lavasoft.sx._n_n.Personnn_sx"/>
</set>
</class>
</hibernate-mapping>
六、測試方法
public class Test_nn_sx {
public static void main(String[] args){
Addressnn_sx add1=new Addressnn_sx();
Addressnn_sx add2=new Addressnn_sx();
Personnn_sx p1=new Personnn_sx();
Personnn_sx p2=new Personnn_sx();
add1.setAddressdetail("鄭州市經(jīng)三路");
add2.setAddressdetail("合肥市宿州路");
p1.setName("wang");
p1.setAge(30);
p2.setName("zhang");
p2.setAge(22);
p1.getAddresses().add(add1);
p1.getAddresses().add(add2);
p2.getAddresses().add(add2);
add1.getPersons().add(p1);
add2.getPersons().add(p1);
add2.getPersons().add(p2);
Session session= HibernateUtil.getCurrentSession();
Transaction tx=session.beginTransaction();
session.save(p1);
session.save(p2);
//??????? session.saveOrUpdate(add1);
//??????? session.saveOrUpdate(add2);
tx.commit();
HibernateUtil.closeSession();
}
}
七、測試結(jié)果
1) :正常保存.
session.save(p1);
session.save(p2);
//??????? session.saveOrUpdate(add1);
//??????? session.saveOrUpdate(add2);
Hibernate: insert into PERSON_nn_sx (name, age) values (?, ?)
Hibernate: insert into ADDRESS_nn_sx (addressdetail) values (?)
Hibernate: insert into ADDRESS_nn_sx (addressdetail) values (?)
Hibernate: insert into PERSON_nn_sx (name, age) values (?, ?)
Hibernate: insert into join_nn_sx (personid, addressid) values (?, ?)
Hibernate: insert into join_nn_sx (personid, addressid) values (?, ?)
Hibernate: insert into join_nn_sx (personid, addressid) values (?, ?)

本文出自 “熔 巖” 博客,轉(zhuǎn)載請與作者聯(lián)系!

?

總結(jié)

以上是生活随笔為你收集整理的Hibernate 实体关联关系映射----总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。