标签:
两张表的多对多关系,在数据库中通常是通过第三张中间表来实现的,第三张中间表放的是两张表各自的主键值,通过主键与主键的对应来体现表直接的关系。比如在权限系统中,一个用户可以拥有多种权限,而一种权限也可以授予多个用户。
在持久化对象设计的时候,角色和用户都分别有一个集合来防止拥有它的用户或角色。角色类的设计:
public class RolePO {
private int id;
private String name;
private Set employees = new HashSet();
......
}
用户类的设计:
public class EmployeePO {
private int id;
private String name;
private Set roles = new HashSet();
......
}
映射对象关系映射文件配置如下:
RolePO.hbm.xml:
<hibernate-mapping>
<class name="com.lovo.po.RolePO" table="t_role">
<id name="id" column="r_id" type="int">
<generator class="increment"></generator>
</id>
<property name="name" column="f_name" type="string"></property>
<set name="employees" table="mapping" cascade="all" inverse="false">
<key column="f_r_id"></key>
<many-to-many class="com.lovo.po.EmployeePO" column="f__e_id"/>
</set>
</class>
</hibernate-mapping>
EmployeePO.hbm.xml:
<hibernate-mapping>
<class name="com.lovo.po.EmployeePO" table="t_employee">
<id name="id" column="e_id" type="int">
<generator class="increment"></generator>
</id>
<property name="name" column="f_name" type="string"></property>
<set name="roles" table="mapping" cascade="all" inverse="true">
<key column="f_e_id"></key>
<many-to-many class="com.lovo.po.RolePO" column="f_r_id"/>
</set>
</class>
</hibernate-mapping>
需要注意的是<key>中的column对应的是当前类在中间表中对应的字段,即对方想要的外键,而<many-to-many class="com.lovo.po.RolePO" column="f_roleid"/>中的column指示的是中间表中本类想要的外键。还要注意的是inverse的值只能有一个为true,因为如果双发都为true,那么双发都去维护关系,会造成中间关系表中出现重复的数据。在进行删除的时候Hibernate会删除id所对应的信息和中间关系表中对应的信息,如,删除用户
如:Hibernate: delete from mapping where f_e_id=?
Hibernate: delete from employee where e_id=?
标签:
原文地址:http://www.cnblogs.com/LuckyBao/p/5925940.html