hibernate对象关系映射(一对一,…

来源:互联网 发布:淘宝fake潮牌最好的店 编辑:程序博客网 时间:2024/05/18 00:56

关联映射的本质:
* 将关联关系映射到数据库,所谓的关联关系是对象模型在内存中的一个或多个引用。


在这里要注意一点:单向映射、双向映射与OneToOne OneToMany ManyToMany是两个概念,是可以搭配使用的!!
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
举个简单例子:
1*一对一单向映射:person-->idCard  在person端xml中 <one-to-one name="idCard"constrained="true" ></one-

to-one>
1*一对一双向映射:person<-->idCard  在idCard端也要加上xml中 <one-to-one name="person"constrained="true"

></one-to-one>

<!--one-to-one标签的含义,指示hibernate怎么加载它的关联对象,默认根据主键加载,
constrained="true",表明当前主键上存在一个约束,person的主键作为外键参照了idCard-->
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
2**一对多单向映射 Class----->Student
一对多关联映射利用了多对一关联映射原理。也就是说一对多和多对一的映射策略是一样的,只是站的角度不同。
多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一。
一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多。
class端(一)
<set name="students">
   <keycolumn="classid" />
   <one-to-manyclass="com.yuli.model.Student" />
</set>
student多的一端不需配:
在一的一端维护关系的缺点:
* 如果将student表里的classid字段设置为非空,则无法保存。
*因为不是在student这一端维护关系,所以student不知道是哪个班的,所以需要发出多余的update语句来更新关系。
注意:一对多通常采用set集合,因为是不可重复的。尽量用set接口不用HashSet。因为Hibernate有延迟加载,实体类

通过代理实现延迟加载,集合也有延迟加载。

2**一对多双向映射 Class<----->Student
class端:
<set name="students" inverse="true"cascade="all">
   <keycolumn="classid" />
   <one-to-manyclass="com.yuli.model.Student" />
</set>
student端:
<!--在多一端采用<many-to-one>-->
<many-to-one name="class"column="classid"/>
</class>
column指定引用的外键,这必须和class的key标签中的主键一样!!
如果在一的一端维护一对多关联关系,hibernate会发出多余的udpate语句,所以我们一般在多的一端来维护关联关系。

关于inverse属性:
inverse主要用在一对多和多对多双向关联上,inverse可以被设置到集合标签<set>上,
默认inverse为false,所以我们可以从一的一端和多的一端维护关联关系,如果设置成inverse为true,则我们只能从多

一端来维护关联关系
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
3***多对一单向映射User->groupType

<many-to-one name="groupType" column="grouptype"cascade="all"></many-to-one>

注意:Persisent对象不能引用Transisent对象,因为Transisent状态没有分配oid值,会抛出

TransisentObjectException异常。采用cascade属性是解决TransientObjectException异常的一种手段。
可以采用<many-to-one>标签,指定多的一端的unique=true,这样就限制了多的一端的多重性唯一,通过这种手段映射

一对一唯一外键关联。

 

3***多对一双向映射
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
4****多对多单向映射  User---->Role
User一端:
<hibernate-mapping>
<class name="com.yuli.model.User"table="user">
<id name="id">
   <generatorclass="native"/>
</id>
<property name="name"/>
<set name="roles"table="user_role">
   <keycolumn="userid"/>
   <many-to-manyclass="com.yuli.model.Role" column="roleid"/>
</set>
</class>
</hibernate-mapping>
Role端:
无需写此集合
4****多对多双向映射 User<---->Role
User一端:
<set name="roles"table="user_role">
   <keycolumn="userid"/>
   <many-to-manyclass="com.yuli.model.Role" column="roleid"/>
</set>
Role端:
<hibernate-mapping>
<class name="com.yuli.model.Role"table="role">
<id name="id">
   <generatorclass="native"/>
</id>
<property name="name"/>
<set name="users" table="user_role"order-by="userid">
   <keycolumn="roleid"/>
   <many-to-manyclass="com.yuli.model.User" column="userid"/>
</set>
</class>
</hibernate-mapping>