Hibernate 实体关联关系映射----总结
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 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) */ ? | |||||||
| ? | |||||||
| ? | |||||||
| 五、映射方法 | |||||||
| ? | |||||||
| <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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如果知道dll文件是面向32位系统还是面
- 下一篇: POI详细教程