SSH——Hibernate初学者之旅(二)
2016-01-15 18:45
751 查看
上次我们大致介绍了一下hibernate的概念、作用等,知道了hibernate是一种持久化的ORM框架,那么在实际使用中我们是怎么来实现映射关系的呢,我们先一起来看看一对一关联的映射关系。
解说1: foreign :使用另外一个相关联的对象的标识符。为了确保两个对象的主键值相等。
解说2: one-to-one的单向关联中,如果constrained=false,则会在查询时就全部取出来,用left outer join的方式。如果constrained=true,hibernate即会延迟加载sql,只把主表的查出来,等有用到关联表的再发sql取。
解说1: cascade属性的可能值有
all: 所有情况下均进行关联操作,即save-update和delete。
none: 所有情况下均不进行关联操作。这是默认值。
save-update: 在执行save/update/saveOrUpdate时进行关联操作。
delete: 在执行delete 时进行关联操作。
all-delete-orphan: 当一个节点在对象图中成为孤儿节点时,删除该节点。比如在一个一对多的关系中,Student包含多个book,当在对象关系中删除一个book时,此book即成为孤儿节点。
解说2: constrained=true,hibernate即会延迟加载sql,one-to-one的双向关联中,必须设置constrained=true,要不然会有重复数据读。
解说1:事实上,单向1-1与N-1的实质是相同的,1-1是N-1的特例,单向1-1与N-1的映射配置也非常相似。只需要将原来的many-to-one元素增加unique=”true”属性,用于表示N的一端也必须是唯一的,在N的一端增加了唯一的约束,即成为单向1-1。
解说1: property-ref: 在关联对象中用于与本对象关联的属性。
解说1: unique=true是指这个字段的值在这张表里不能重复,所有记录值都要唯一,就像主键那样
一、实体
一个人对应一个地址。[code]//人 public class Person11fk { private int personid; private String name; private int age; private Address11fk address11fk;
[code]//地址 public class Address11fk { private int addressid; private String addressdetail;
二、主键–关联映射法
1、单向
[code]<hibernate-mapping> <class name="com.lavasoft.dx._1_1_pk.Person11pk" table="PERSON_11pk"> <id name="personid" column="presonid"> <!--基于主键关联时,主键生成策略是foreign,表明根据关联类生成主键--> <generator class="foreign"> <!--关联持久化类的属性名--> <param name="property">address11pk</param> </generator> </id> <property name="name"/> <property name="age"/> <!--用于映射1-1关联--> <one-to-one name="address11pk" constrained="true"/> </class> </hibernate-mapping>
[code]<hibernate-mapping> <class name="com.lavasoft.dx._1_1_pk.Address11pk" table="ADDRESS_11pk"> <id name="addressid"> <generator class="identity"/> </id> <property name="addressdetail"/> </class> </hibernate-mapping>
解说1: foreign :使用另外一个相关联的对象的标识符。为了确保两个对象的主键值相等。
解说2: one-to-one的单向关联中,如果constrained=false,则会在查询时就全部取出来,用left outer join的方式。如果constrained=true,hibernate即会延迟加载sql,只把主表的查出来,等有用到关联表的再发sql取。
2、双向
[code]<hibernate-mapping> <class name="com.lavasoft.dx._1_1_fk.Person11fk" table="PERSON_11fk"> <id name="personid" column name="id"> <generator class="identity"/> </id> <property name="name"/> <property name="age"/> <!-- cascade="all":在保存person对象的时候,级联保存person对象关联的address对象 --> <one-to-one name="address11pk" cascade="all" /> </class> </hibernate-mapping>
[code]<hibernate-mapping> <class name="com.lavasoft.dx._1_1_fk.Address11fk" table="ADDRESS_11fk"> <id name="addressid" column name="id"> <!--基于主键关联时,主键生成策略是foreign,表明根据关联类生成主键--> <generator class="foreign"> <!--关联持久化类的属性名--> <param name="property">address11pk</param> </generator> </id> <property name="addressdetail"/> <!-- 表示在address表存在一个外键约束,外键参考相关联的表person --> <one-to-one name="person11fk" constrained="true" /> </class> </hibernate-mapping>
解说1: cascade属性的可能值有
all: 所有情况下均进行关联操作,即save-update和delete。
none: 所有情况下均不进行关联操作。这是默认值。
save-update: 在执行save/update/saveOrUpdate时进行关联操作。
delete: 在执行delete 时进行关联操作。
all-delete-orphan: 当一个节点在对象图中成为孤儿节点时,删除该节点。比如在一个一对多的关系中,Student包含多个book,当在对象关系中删除一个book时,此book即成为孤儿节点。
解说2: constrained=true,hibernate即会延迟加载sql,one-to-one的双向关联中,必须设置constrained=true,要不然会有重复数据读。
三、外键–关联映射法
1、单向
[code]<hibernate-mapping> <class name="com.lavasoft.dx._1_1_fk.Person11fk" table="PERSON_11fk"> <id name="personid"> <generator class="identity"/> </id> <property name="name"/> <property name="age"/> <!--用来映射关联PO column是Address在该表中的外键列名,增加unique变成“1-1”--> <many-to-one name="address11fk" column="addressId" unique="true"/> </class> </hibernate-mapping>
[code]<hibernate-mapping> <class name="com.lavasoft.dx._1_1_fk.Address11fk" table="ADDRESS_11fk"> <id name="addressid"> <generator class="identity"/> </id> <property name="addressdetail"/> </class> </hibernate-mapping>
解说1:事实上,单向1-1与N-1的实质是相同的,1-1是N-1的特例,单向1-1与N-1的映射配置也非常相似。只需要将原来的many-to-one元素增加unique=”true”属性,用于表示N的一端也必须是唯一的,在N的一端增加了唯一的约束,即成为单向1-1。
2、双向
[code]<hibernate-mapping> <class name="com.lavasoft.dx._1_1_fk.Person11fk" table="PERSON_11fk"> <id name="personid"> <generator class="identity"/> </id> <property name="name"/> <property name="age"/> <!--用来映射关联PO column是Address在该表中的外键列名,增加unique变成“1-1”--> <many-to-one name="address11fk" column="addressId" unique="true"/> </class> </hibernate-mapping>
[code]<hibernate-mapping> <class name="com.lavasoft.dx._1_1_fk.Address11fk" table="ADDRESS_11fk"> <id name="addressid"> <generator class="identity"/> </id> <property name="addressdetail"/> <!-- 必须制定property-ref为关系字段的名称 --> <one-to-one name="person11fk" property-ref="address11fk"></one-to-one> </class> </hibernate-mapping>
解说1: property-ref: 在关联对象中用于与本对象关联的属性。
四、连接表–关联映射法
1、单向
[code]<hibernate-mapping> <class name="com.lavasoft.dx._1_1_tab.Person11tab" table="PERSON_11tab"> <id name="personid"> <generator class="identity"/> </id> <property name="name"/> <property name="age"/> <!--使用join元素显式确定链接表--> <join table="join_11tab"> <key column="personid"/> <!--映射1-1关联属性,其中unique=“true”属性确定为“1-1”--> <many-to-one name="address11tab" unique="true"/> </join> </class> </hibernate-mapping>
[code]<hibernate-mapping> <class name="com.lavasoft.dx._1_1_tab.Address11tab" table="ADDRESS_11tab"> <id name="addressid"> <generator class="identity"/> </id> <property name="addressdetail"/> </class> </hibernate-mapping>
解说1: unique=true是指这个字段的值在这张表里不能重复,所有记录值都要唯一,就像主键那样
2、双向
[code]<hibernate-mapping> <class name="com.lavasoft.dx._1_1_tab.Person11tab" table="PERSON_11tab"> <id name="personid"> <generator class="identity"/> </id> <property name="name"/> <property name="age"/> <!--使用join元素显式确定链接表--> <join table="join_11tab" optional="true"> <key column="personid" unique="true"/> <!--映射1-1关联属性,其中unique=“true”属性确定为“1-1”--> <many-to-one name="address11tab" column="addressid" not-null="true" unique="true"/> </join> </class> </hibernate-mapping>
[code]<hibernate-mapping> <class name="com.lavasoft.dx._1_1_tab.Address11tab" table="ADDRESS_11tab"> <id name="addressid"> <generator class="identity"/> </id> <property name="addressdetail"/> <!--使用join元素显式确定链接表--> <join table="join_11tab" optional="true"> <key column="addressid" unique="true"/> <!--映射1-1关联属性,其中unique=“true”属性确定为“1-1”--> <many-to-one name="person11tab" column="personid" not-null="true" unique="true"/> </join> </class> </hibernate-mapping>
总结:
通过此次学习,我们知道了Hibernate中一对一关系映射的种类以及实现,但是在我们实际开发中最常用的还是一对多关系的处理,下次我们将一起学习Hibernate一对多关系的映射关系。敬请期待。相关文章推荐
- Concurrency3
- CentOS 6.5系统服务详解( 转)
- Textfield根据条件显示提示框-LHInfoTextfield(0.1.0)
- hive分组排序 取top N
- hive分组排序 取top N
- 基数和偶数分离
- .NET中提升UAC权限的方法总结
- 数据库之组合查询
- windows相关小知识
- Android 从输入法 到 EditText 研究
- mysql常见错误码
- Linux Bash算数运算方法小结
- Java提高学习之Object(3)
- python中的时间函数编写
- Android GPU加速渲染自定义View 性能改善<13>
- Atitit.java jna 调用c++ dll 的总结
- 第一次写python爬虫
- 协议和委托的各种用法
- Java 并发和多线程(一) Java并发性和多线程介绍[转]
- Atitit.java jna 调用c++ dll 的总结