Hibernate读书笔记-----Hibernate的关联映射之1-1关联映射(二)

2014-11-24 08:34:33 · 作者: · 浏览: 1
对于双向的1-1关联需要让两个持久化列都增加引用关联实体的属性,并为该属性提供setter和getter方法。持久化类:如上。
2.1基于主键的双向1-1关联映射
基于主键的双向1-1关联映射同样需要在一端的主键生成器策略使用foreign策略,表明将根据对方的主键来生成自己的主键,本实体不能拥有自己的主键生成策略。另一端需要使用元素用来映射关联实体,否则就变成了单向的。映射文件如下:
Person.hbm.xml
[html]











IDCard.hbm.xml
[html]






person







对于操作这个两个实体增加同时。因为可以通过两边来访问,所以这里就演示查询
这里查询分为两种:基于主表查询和基于从表查询
基于主表查询(通过主表查询从表记录)
[java]
static void query(int personid){
Session session = null;
try{
session = HibernateUtil.getSession();

Person person = (Person) session.get(Person.class, personid);
System.out.println("useLife="+person.getIdCard().getUseLife());
}finally{
if(session!=null)
session.close();
}
}
我们知道对于N-1关联查询的时候,系统会产生两条sql查询语句来检索从表对象:一条先查询主表,然后根据外键从从表中获取相对应的记录。但是对于1-1关联时,它并不是产生两条sql语句来查询。而是一条sql语句,通过外连接来连接两张表的。如下
[sql]
Hibernate: select person0_.personID as personID1_1_, person0_.personName as personName1_1_, idcard1_.idCardID as idCardID2_0_, idcard1_.useLife as useLife2_0_ from person person0_ left outer join idCard idcard1_ on person0_.personID=idcard1_.idCardID where person0_.personID=

基于从表查询(通过从表查询主表)
[java]
static void query(int personid){
Session session = null;
try{
session = HibernateUtil.getSession();

IDCard idCard = (IDCard) session.get(IDCard.class, 1);
System.out.println(idCard.getPerson().getName());
}finally{
if(session!=null)
session.close();
}
}
通过从表查询主表与通过主表查询从表又有点不同了。在这里它不再是产生一条sql语句,而是两条。如下:
[sql]
Hibernate: select idcard0_.idCardID as idCardID2_0_, idcard0_.useLife as useLife2_0_ from idCard idcard0_ where idcard0_.idCardID=

Hibernate: select person0_.personID as personID1_1_, person0_.personName as personName1_1_, idcard1_.idCardID as idCardID2_0_, idcard1_.useLife as useLife2_0_ from person person0_ left outer join idCard idcard1_ on person0_.personID=idcard1_.idCardID where person0_.personID=
它会先查询从表,获取记录,然后再通过外连接方式连接两张表根据personID获取记录。

2.2基于外键的双向1-1关联映射
对于基于外键的双向1-1关联映射。外键可以存放任意一边。需要存放外键的一端,需要增加元素。同时也需要添加unique="true"属性。
对于双向单位1-1关联映射,两个实体原本是处于平等状态的。但是当我们选择一个表来增加外键后,该表就变成了从表,另一个表变成主表。
另一端需要使用元素,该元素需要使用name属性指定关联属性名,同时也需要使用property-ref属性来指定引用关联类的属性。property-ref的值是从表中的引用属性。
映射文件如下:
Person.hbm.xml
[html]











IDCard.hbm.xml
[html]












2.3有连接表的双向1-1关联映射
采用这个方式是非常少的,因为这中情况映射相当复杂,数据模型繁琐,一般不推荐采用这种策略。
双向1-1关联两端都需要使用元素指定连接表,元素的table属性用于指定连接表的表名,所有两端的table属性值应该是一致的。同时两个也需要增加key元素映射连接表的外键列,还需要增加元素映射关联属性,两个元素都需要增加unique="true"属性。注意这里两端的key元素和中column的属性值应该是相反的。
同时为了让hibernate在连接表的两个数据列上增加唯一约束,映射文件应该为两个元素指定unique="true"。
当使用连接表来建立1-1关联关系时,两个实体应该是绝对的平等,不存在任何的主从约束关系,hibernate映射他们的连接表时,将会选择某一个外键作为连接表的主键--因此两个持久化类的映射