您的位置:首页 > 其它

Hibernate关联之 一对多外键双向关联

2015-08-28 15:33 330 查看
Hibernate 一对多外键双向关联
一、模型介绍
一个人(Person)对应多个地址(Address)。
二、实体(省略getter、setter方法)
public class Person1nfkboth implements Serializable {
private int personid;
private String name;
private int age;
private Set addresses=new HashSet();
public class Address1nfkboth implements Serializable {
private int addressid;
private String addressdetail;
private Person1nfkboth person1nfkboth;
三、表模型
mysql> desc person_1nfkboth;
+----------+--------------+------+-----+---------+----------------+
| 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_1nfkboth;
+---------------+--------------+------+-----+---------+----------------+
| 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_1nfkboth` (
`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_1nfkboth` (
`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;
五、映射方法
OneToManyFKBothPerson.hbm.xml

<hibernate-mapping>

<class name="com.bean.Person1nfkboth" table="PERSON_1nfkboth">

<id name="personid">

<generator class="identity"/>

</id>

<property name="name"/>

<property name="age"/>

<!--映射集合属性,关联到持久化类-->
<set name="addresses" inverse="true" cascade="all">

<!--column用于指定外键列名-->
<key column="personid" not-null="true"/>

<!--映射关联类-->
<one-to-many class="com.bean.Address1nfkboth"/>

</set>

</class>

</hibernate-mapping>


OneToManyFKBothAddress.hbm.xml

<hibernate-mapping>

<class name="com.bean.Address1nfkboth" table="ADDRESS_1nfkboth">

<id name="addressid">

<generator class="identity"/>

</id>

<property name="addressdetail"/>

<!--映射关联属性,column属性指定外键列名-->
<many-to-one name="person1nfkboth"

class="com.bean.Person1nfkboth"

fetch="select"

cascade="save-update">

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

</many-to-one>

</class>

</hibernate-mapping>


六、测试

public class Test_1nfkboth {
@Test
public void test_1nfkboth(){

Address1nfkboth add1 = new Address1nfkboth();
Address1nfkboth add2 = new Address1nfkboth();
Person1nfkboth p = new Person1nfkboth();

add1.setAddressdetail("郑州市经三路");
add2.setAddressdetail("合肥市宿州路");

p.setName("liu");
p.setAge(26);

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

add1.setPerson1nfkboth(p);
add2.setPerson1nfkboth(p);

Session session = HibernateUtil.getCurrentSession();
Transaction tx = session.beginTransaction();
session.save(p);
session.saveOrUpdate(add1);
session.saveOrUpdate(add2);
tx.commit();
HibernateUtil.closeSession();

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: