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){
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关联映射。外键可以存放任意一边。需要存放外键的一端,需要增加
对于双向单位1-1关联映射,两个实体原本是处于平等状态的。但是当我们选择一个表来增加外键后,该表就变成了从表,另一个表变成主表。
另一端需要使用
映射文件如下:
Person.hbm.xml
[html]
IDCard.hbm.xml
[html]
2.3有连接表的双向1-1关联映射
采用这个方式是非常少的,因为这中情况映射相当复杂,数据模型繁琐,一般不推荐采用这种策略。
双向1-1关联两端都需要使用
同时为了让hibernate在连接表的两个数据列上增加唯一约束,映射文件应该为两个
当使用连接表来建立1-1关联关系时,两个实体应该是绝对的平等,不存在任何的主从约束关系,hibernate映射他们的连接表时,将会选择某一个外键作为连接表的主键--因此两个持久化类的映射