吃掉大象的蚂蚁的专栏

想学习java就来我这里报到

用户操作
[即时聊天] [发私信] [加为好友]
耿鸿飞ID:eoe2005
24595次访问,排名4832(1)好友4人,关注者6
eoe2005的文章
原创 35 篇
翻译 0 篇
转载 32 篇
评论 10 篇
吃掉大象的蚂蚁的公告
我的心情很不好,不是因为工作让我郁闷,而是因为我又很好的精神,不少的收入,沉稳的性格,温和的秉性,但是到现在依然孤苦一人,现在感情问题成了我最头痛的,难道程序员真的是爱情白吃把,我不想我我是那样的人,我只想好好的工作,好好的爱一个人,但是世界让我很悲伤,我不能控制世界的发展,我也不能左右别人的思想去爱我,我真可以慢慢的在黑夜里辗转无数次后进入梦境,或者是在磅礴的雨天感觉水的凉爽与透明,为此我努力的坚持住,我要让世界知道,我的爱也许就是世界上最真的,没有电影当中的浪漫,没有有钱人的那种XX,我只是会很认真地去爱,这就是我的爱情宣言。 来吧!你要想和我交朋友. 请email:eoe0371@163.com
最近评论
lx:全是错别字,属实看不进去
Enthusiasm:解释得很明白,受益非浅~
PS:祝你感情问题早日得到解决
twoball:噢,陬,太棒了.
Spring:
不好使啊!!
Y-boy.cn:webOS, 不太看好..... 它是新东西,但..不看好..
文章分类
收藏
相册
娃哈哈
java学习
java1.5中文帮助文档
java世界中文论坛
java开源大全
php学习
mysql5.0下载
php中国联盟
电脑学习
ibm学习
W3C标准中文
老二
我的sohu的blog
老二的blog
商业
暗恋的女人(RSS)
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 Hibernate一对一关系操作对象收藏

新一篇: servlet制作过滤器 | 旧一篇: 在Java中应用设计模式--Singleton


Hibernate一对一关系操作对象 

总的来说有四种方式,我将意义的在本片文章中介绍
一:以主键关联

 概念:关联的两个实体共享一个主键
例如我们建立两个表,分别为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'时才采用预先抓取的)

发表于 @ 2006年05月25日 12:01:00|评论(loading...)|编辑|收藏

新一篇: servlet制作过滤器 | 旧一篇: 在Java中应用设计模式--Singleton

评论

#Enthusiasm 发表于2008-07-10 13:35:27  IP: 117.14.134.*
解释得很明白,受益非浅~
PS:祝你感情问题早日得到解决
发表评论  


登录
Csdn Blog version 3.1a
Copyright © 吃掉大象的蚂蚁