Jason Heck's blog

爱好折腾电脑、幻想、探索未知事物,对挨踢业和网络安全方面十分感兴趣,横向发展,广而不精。作息时间不定,上线时间诡异,QQ常年隐身,偶尔上线,开源产品的支持者,珍爱生命,远离微软,病毒爱好者和Web前端爱好者。虚拟主机评测http://www.idcpw.com

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
总的来说有四种方式,我将意义的在本片文章中介绍
一:以主键关联

概念:关联的两个实体共享一个主键
例如我们建立两个表,分别为user id pk,name,password
                                             userinfor id pk,email,age,address
user和userinfor共享一个主键id,并且两个表是一对一关系,那么如何让一个表引用另一个表生成的主键那?我们可以用hibernate的主键foreign机制生成。
我们先看看user.hbm.xml文件
.......
<hibernate-mapping>
<class name="model.User" lazy="true">
   <id name="id" unsaved-value="null">
    <generator class="uuid.hex"/>
   </id>
   <property name="name" type="string"/>
   <property name="password" type="string"/>
   <one-to-one name="userinfor"
        class="model.Userinfor"
        fetch="join"
        cascade="all"
        />
</class>
<hibernate-mapping>
.......
     one-to-one的属性cascade=all表示user的增删改操作也会反映在userinfor对象当中。我们再看看userinfor.hbm.xml文件.
<hibernate-mapping>
<id name="id">
   <generator name="foreign">
    <param name="property">user</param>
   </generator>
</id>
<property name="email" column="email" type="string"/>
<property name="age" column="age" type="int"/>
<property name="address" column="address" type="string"/>
<one-to-one name="user"
       class="model.User"
       constrained="true"<!-引用user的主键id为外键-->
       />
</hibernate-mapping>
让我们看看java的代码片段
.....
User user=new User();
user.setName("name");
user.setPassword("pass");
Userinfor u=new Userinfor();
u.setEmail("email");
u.setAge(11);
u.setAddress("address");
user.setUserinfor(u);
u.setUser(user);
DAO.saveObj(user);
最后打开你的数据库旧可以看到结果了。

二,一对一以外键关联

以外键关联的概念:两个实体各自有不同的主键,但是一个实体有一个外键引用另一个实体的主键。例如:
表 user id pk,name,passeword
     userinfor id pk,uid fk,infor
先看user.hbm.xml
......
<hibernate-mapping>
<class name="user" table="user" lazy="true">
   <id name="id" unsaved-value="null">
    <generator class="uuid.hex"/>
   </id>
   <property name="name" type="string"/>
   <property name="password" type="string"/>
   <one-to-one name="userinfor"
    class="model.Userinfor"
    fetch="join"
    cascade="all"
    />
</class>
</hibernate-mapping>
可以看到这个同我们第一次用到的一样啊
然后我们看看userinfor.hbm.xml的结构
.....
<hibernate-mapping>
<class name="userinfor" table="userinfor" lazy="true">
   <id name="id">
    <generator class="uuid.hex"/>
   </id>
   <property name="infor" column="infor" type="string"/>
   <many-to-one name="user"
     class="model.User"
     unique="true"
     <!-唯一的多对一,其实就便成了一对一了-->
     columnn="uid"
     />
</class>
</hibernate-mapping>
以外键关联的一对一,其实就变成了一对多的双向关联,编写时直接按照一对多和多对一的要求编写,最后在many-to-one加上unique='true'即可说明他只不过是一对多关系的一个特例。编写java代码:
.......
User u=new User();
u.setName("name");
u.setPassword("password");
Userinfor ui=new Userinfor();
ui.setInfor("infor");
u.setUserinfor(ui);
ui.setUser(u);
DAO.saveObj(u);
......
三:默认的级连关系

一对多默认级连关系为预先抓取,而一对多,多对多都是立即加载
看看user.hbm.xml
<one-to-one name="userinfor"
   class="model.Userinfor"
   cascade="all"/>
以上我们并没有显示的设置级连关系。这样在取的userinfor时将用默认的级连关系。
.....
User u=(User)DAO.getByid(User.class,"字符穿,相当于where id='此值'");

四:延迟加载

一对一关系进行延迟加载时与其他关系不同,多对一是在class标签中设置lazy='true',一对多和多对多是在set标签中设置lazy=”true“,而一对一则在class标签当中设置lazy='true'并且在one-to-one标签当中设置constrained='true'。
.....
<hibernate-mapping>
<class name="model.User" table="user">
   <one-to-one name="userinfor"
     class="model.Userinfor"
     contrained="true"
     cascade="all"
     />
</class>
</hibernate-mapping>
java代码
...
User u=(User)DAO.getByid(User.class,"id");
.....
次代码只是加载了user对象,而没有加载userinfor对象,而且忽略了默认的预先抓取,(这是默认的,只有显示的指定fatch='true'时才采用预先抓取的)

posted on 2008-10-23 23:40  Heck  阅读(296)  评论(0编辑  收藏  举报
关于我们 | 石器时代| 主机评测 | IDC评测 | IDC投诉 | IDC大全 | 广告服务 | 友情链接 | Heck's Blog
Copyright © 2010 - 2012 石器时代旗下网站 All Rights Reserved 石器时代工作室
联系电话:0755-84256821 服务QQ:想我就吻我想我就吻我 邮箱:Heck@hecks.tk
石器时代技术团队专注开源产品研究,您人生道路上真诚的朋友!感谢www.Hecks.tk 提供相关链接。