Hibernate 多对多单向关联
一 模型介绍
多个人,对应多个地址,一个人可以对应多个地址,一个地址也可以对应多个人
在使用这种映射方式时必须要使用连接表。
二 实体(省略getter()和setter()方法)
public class Address
{
private int addressid;
private String addressdetail;
......
}
public class Person implements Serializable
{
private static final long serialVersionUID = 1L;
private int personid;
private String name;
private int age;
private Set addresses = new HashSet();
......
}
三 表结构
CREATE TABLE `address3` (
`addressid` int(11) NOT NULL,
`addressdetail` varchar(255) default NULL,
PRIMARY KEY (`addressid`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
CREATE TABLE `join_table2` (
`person_id` int(11) NOT NULL,
`address_id` int(11) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
CREATE TABLE `person3` (
`personid` int(11) NOT NULL auto_increment,
`name` varchar(255) NOT NULL,
`age` int(11) NOT NULL,
PRIMARY KEY (`personid`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
四 映射方法
<hibernate-mapping>
<class name="example.singlenton.Address" table="address3">
<id name="addressid" type="integer">
<generator class="increment"/>
</id>
<property name="addressdetail">
<column name="addressdetail"/>
</property>
</class>
<class name="example.singlenton.Person" table="person3">
<id name="personid" type="integer">
<generator class="increment"/>
</id>
<property name="name" type="string">
<column name="name"/>
</property>
<property name="age" type="integer">
<column name="age"/>
</property>
<set name="addresses" table="join_table2"> //因为是单向的映射,所以,set写在调用另一个实体的一边
<key column="person_id"/>
<many-to-many column="address_id" class="example.singlenton.Address"/>
</set>
</class>
五 测试类
public static void main(String[] args)
{
Person yeeku1 = new Person();
Person yeeku2 = new Person();
yeeku1.setAge(111);
yeeku1.setName("测试1111 N to N");
yeeku2.setAge(222);
yeeku2.setName("测试2222 N to N");
Address a1 = new Address();
a1.setAddressdetail("长安街道66号");
Address a2 = new Address();
a2.setAddressdetail("测试地址");
Address a3 = new Address();
a3.setAddressdetail("望京西街");
yeeku1.getAddresses().add(a1);
yeeku1.getAddresses().add(a2);
yeeku2.getAddresses().add(a2);
yeeku2.getAddresses().add(a3);
Session session = HibernateSessionFactory.getSession();
Transaction tx = session.beginTransaction();
session.save(yeeku1);
session.save(yeeku2);
session.save(a1);
session.save(a2);
session.save(a3);
tx.commit();
tx = null;
HibernateSessionFactory.closeSession();
}
六 运行结果
Hibernate: insert into person3 (name, age, personid) values (?, ?, ?)
Hibernate: insert into person3 (name, age, personid) values (?, ?, ?)
Hibernate: insert into address3 (addressdetail, addressid) values (?, ?)
Hibernate: insert into address3 (addressdetail, addressid) values (?, ?)
Hibernate: insert into address3 (addressdetail, addressid) values (?, ?)
Hibernate: insert into join_table2 (person_id, address_id) values (?, ?)
Hibernate: insert into join_table2 (person_id, address_id) values (?, ?)
Hibernate: insert into join_table2 (person_id, address_id) values (?, ?)
Hibernate: insert into join_table2 (person_id, address_id) values (?, ?)
注:
推荐使用
session.save(yeeku1);
session.save(yeeku2);
session.save(a1);
session.save(a2);
session.save(a3);
这样保存。
因为是多对多的操作,所以大家在操作的时候一定要注意对应关系,否则的话,乱得不堪设想……