一个人可对应多个地址,一个地址也可以对应多个人。
|
|
二、实体(省略getter、setter方法)
|
|
public class Personnnboth {
|
private int personid;
|
private String name;
|
private int age;
|
private Set addresses=new HashSet();
|
|
public class Addressnnboth {
|
private int addressid;
|
private String addressdetail;
|
private Set persons = new HashSet();
|
|
三、表模型
|
|
mysql> desc person_nnboth;
|
+----------+--------------+------+-----+---------+----------------+
|
| 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_nnboth;
|
+---------------+--------------+------+-----+---------+----------------+
|
| Field | Type | Null | Key | Default | Extra |
|
+---------------+--------------+------+-----+---------+----------------+
|
| addressid | int(11) | NO | PRI | NULL | auto_increment |
|
| addressdetail | varchar(255) | YES | | NULL | |
|
+---------------+--------------+------+-----+---------+----------------+
|
|
mysql> desc join_nnboth;
|
+-----------+---------+------+-----+---------+-------+
|
| 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_nnboth` (
|
`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_nnboth` (
|
`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_nnboth` (
|
`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_nnboth` (`addressid`),
|
CONSTRAINT `FK6EBBC5EF6C600921` FOREIGN KEY (`personid`) REFERENCES `person_nnboth` (`personid`)
|
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
|
|
五、映射方法
ManyToManyBothPerson.hbm.xml
<hibernate-mapping>
<class name="com.bean.Personnnboth" table="PERSON_nnboth">
<id name="personid">
<generator class="identity"/>
</id>
<property name="name"/>
<property name="age"/>
<!--映射集合属性,关联到持久化类-->
<!--table="join_1ntabboth"指定了连接表的名字-->
<set name="addresses"
table="join_nnboth"
cascade="all">
<!--column="personid"指定连接表中关联当前实体类的列名-->
<key column="personid" not-null="true"/>
<!--column="addressid"是连接表中关联本实体的外键-->
<many-to-many column="addressid" class="com.bean.Addressnnboth"/>
</set>
</class>
</hibernate-mapping>
ManyToManyBothAddress.hbm.xml
<hibernate-mapping>
<class name="com.bean.Addressnnboth" table="ADDRESS_nnboth">
<id name="addressid">
<generator class="identity"/>
</id>
<property name="addressdetail"/>
<!--table="join_nnboth"是双向多对多的连接表-->
<set name="persons"
inverse="true"
table="join_nnboth">
<!--column="addressid"是连接表中关联本实体的外键-->
<key column="addressid"/>
<many-to-many column="personid" class="com.bean.Personnnboth"/>
</set>
</class>
</hibernate-mapping>
六、测试
public class Test_nnboth {
@Test
public void test_nnboth(){
Addressnnboth add1 = new Addressnnboth();
Addressnnboth add2 = new Addressnnboth();
Personnnboth p1 = new Personnnboth();
Personnnboth p2 = new Personnnboth();
add1.setAddressdetail("郑州市经三路");
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();
}
}
|