Posted on 2016-01-13 14:34
魔のkyo 阅读(341)
评论(0) 编辑 收藏 引用 所属分类:
JAVA 、
JSP
多对一关联映射(基于外键的形式,并不一定要在数据库中真的建立外键约束)
<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表的内容不会被修改。