首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Hibernate多对多关系投射

2012-09-13 
Hibernate多对多关系映射两张表的多对多关系,在数据库中通常是通过第三张中间表来实现的,第三张中间表放的

Hibernate多对多关系映射
两张表的多对多关系,在数据库中通常是通过第三张中间表来实现的,第三张中间表放的是两张表各自的主键值,通过主键与主键的对应来体现表直接的关系。比如在权限系统中,一个用户可以拥有多种权限,而一种权限也可以授予多个用户。

   在持久化对象设计的时候,角色和用户都分别有一个集合来防止拥有它的用户或角色。角色类的设计:

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 column="f_name" type="string"></property>
  <set name="employees" table="mapping" cascade="all" inverse="false">
   <key column="f_r_id"></key>
   <many-to-many 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 column="f_name" type="string"></property>
  <set name="roles" table="mapping" cascade="all" inverse="true">
   <key column="f_e_id"></key>
   <many-to-many column="f_r_id"/>
  </set>
</class>
</hibernate-mapping>
需要注意的是<key>中的column对应的是当前类在中间表中对应的字段,即对方想要的外键,而<many-to-many 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://blog.sina.com.cn/s/blog_621a42970100i79o.html

热点排行