posts - 225, comments - 62, trackbacks - 0, articles - 0
   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Hibernate关联映射

Posted on 2016-01-13 14:34 魔のkyo 阅读(341) 评论(0)  编辑 收藏 引用 所属分类: JAVAJSP
多对一关联映射(基于外键的形式,并不一定要在数据库中真的建立外键约束)
<many-to-one name="属性名" column="本表中的列名" class="对应表映射成的类名" />
本表中的列应该是对应表的主键。如果数据库中建立了外键约束似乎可以不配置class
例: 一个管理员属于一个角色,一个角色可以有多个管理员
<hibernate-mapping>
  <class name="com.hsg.pojos.Manager" table="Manager" catalog="qipei" schema="dbo">
    ...
    <many-to-one name="role" column="roleId" class="com.hsg.pojos.Role" cascade="none" />
  </class>
</hibernate-mapping>

多对多关联映射(基于关系表
<set name="属性名" table="关系表名" >
  <key column="关系表中的列名(本表的主键)" ></key>
  <many-to-many column="对应表的主键在关系表中的列名" class="对应表映射成的类名"/>
</set>
例:一个角色有多个权限,一个权限可以赋予多个角色
<hibernate-mapping>
  <class name="com.hsg.pojos.Role" table="Role" catalog="qipei" schema="dbo">
    ...
    <set name="privileges" inverse="false" cascade="none" table="RolePrivilege" >
      <key column="roleId" ></key>
      <many-to-many column="privilegeId" class="com.hsg.pojos.Privilege"/>
    </set>
  </class>
</hibernate-mapping>

一对多关联映射(基于外键的形式,并不一定要在数据库中真的建立外键约束)
<set name="属性名">
  <key column="对应表中的列名(本表的主键)" ></key>
  <one-to-many class="对应表映射成的类名" />
</set>
例:一个产品有多张图片,一张图片只属于一个产品
<hibernate-mapping>
  <class name="com.hsg.pojos.Product" table="Product" catalog="qipei" schema="dbo">
    ...
    <set name="images" lazy="false" inverse="false" cascade="all">
      <key column="productId" ></key>
      <one-to-many class="com.hsg.pojos.ProductImage" />
    </set>
  </class>
</hibernate-mapping>

一对一关联映射
<one-to-one name="属性名" class="对应表映射成的类名" property-ref="本表的主键在对应表映射成的类中的属性"/>
例:经销商是一种特殊的仓库,一个经销商对应一个仓库,一个仓库至多对应一个经销商
<hibernate-mapping>
    <class name="com.hsg.pojos.Distributor" table="Distributor" schema="dbo" catalog="qipei">
        ...
        <one-to-one name="repertory" class="com.hsg.pojos.Repertory" property-ref="id" constrained="true" cascade="all" lazy="false" fetch="join"/>
    </class>
</hibernate-mapping>

constrained: 双向关联时一定要把constrained="true"。
property-ref: 如果property-ref是表的主键可以省略。
inverse: 谁来维护关系,无论是外键还是关系表,谁来维护谁负责更新,false表示自己维护,true表示对方维护。
cascade: 对属性内容的修改是不是要更新到对应的表中。
例如角色会添加或减少权限,但不会也不应该通过角色修改权限的名字,所以这里在角色的映射关系配置中inverse="false" cascade="none"
也正因为cascade="none"只有关系会得到维护,所以可以在添加权限的时候只给Privilege的id赋值即可
role.getPrivileges().add(new Privilege(privilegeId)); //这样关系表是可以正常被维护的,而Privielge表的内容不会被修改。

只有注册用户登录后才能发表评论。