hibernate:one-to-one的学习小经验

      one-to-one在hibernate中可以用来作为两张表之间的主键关联,这也是hibernate中主键关联的一种用法,这样在一张表中的ID,在生成另外一张表的同时回自动插入到相应的ID字段中去,相应的XML文件设置比较简单,举例如下:

    <!-- 建立一对一的到Address的映射,这个是写在User的XML配置文件中的 -->
    <!-- 相应的User bean(PO)中也要添加属性 com.xx.Address  address-->
    <one-to-one name="address" cascade="all" class="com.xx.Address"/>
   
   <!-- cascade的属性设置不再重复了,可以查看hibernate文档 -->

    <!-- 建立一对一的到User的映射,这个是写在Address的XML配置文件中的 -->
    <!-- 相应的Address bean(PO)中也要添加属性 com.xx.User user--> -->
    <one-to-one name="user" class="com.xx.User" constrained="true"/>

      为了在Address中使用User中的主键ID值,我们需要设置Address中的主键生成规则,如下所示,采用foreign关键字

   <id column="ID" name="id" type="long" unsaved-value="0">
      <generator class="foreign">
        <param name="property">user</param> 
      </generator>
   </id>


      这里需要注意的是property的属性值必须与上面到User的映射所填写的name属性值一致,这样就完成了one-to-one的映射关系。

上面的过程都很简单,下面我来说说这里需要注意的地方:

  1.   在设置属性ID的时候必须注意字段的长度,如笔者这样使用oracle的sequence来生成ID,其长度有14位之长,则应选择hibernate类型long,对应的实体中应选择Long,这样不会出现溢出的情况。


  2.   在测试的时候必须要注意这两张表之间因为已经存在了一对一的关系,所以我们不能只写
         user.setAddress(address);
         而忽略了
         address.setUser(user);
         这样在做插入的时候会报出attempted to assign id from null one-to-one property: address的错误,这一点初学者会经常犯,笔者也是其中之一。


 3.   如果不写cascade="all"或者写成cascade="none"的话,即使你写了
         user.setAddress(address);
         address.setUser(user);
       也不会发生任何事情,只有user会被存储。

以上是一些笔者经历的小经验,如果有不对的地方欢迎指正。

posted on 2005-03-23 17:27 Find it, try it, experience it 阅读(9992) 评论(9)  编辑  收藏

评论

# re: hibernate:one-to-one的学习小经验 2005-03-30 09:34 baijsp

您说的最上面的那两个映射文件
<one-to-one name="address" cascade="all" class="com.xx.Address"/>

<one-to-one name="user" class="com.xx.User" constrained="true"/>
分别对应的是那个映射文件呀?第一个是address的吗?还是user的。讲的不太明白。我试过了你的这个例子,没有实现这种关系的映射  回复  更多评论   

# re: hibernate:one-to-one的学习小经验 2005-03-30 12:20 一个人的日子,我独来独往

我已经在例子中用红色的标记进行了标记,希望对你能有所帮助,另外我的QQ 9809973,还有什么问题联系我  回复  更多评论   

# re: hibernate:one-to-one的学习小经验 2005-04-13 08:47 4431

你是一个人吗,需要人和你一起学习吗  回复  更多评论   

# re: hibernate:one-to-one的学习小经验 2005-04-13 15:21 一个人的日子,我独来独往

qq:9809973  回复  更多评论   

# re: hibernate:one-to-one的学习小经验 2005-05-13 16:24 Jun Tsai

能不能把你的保存User时候的代码拿来看看?
谢谢  回复  更多评论   

# re: hibernate:one-to-one的学习小经验 2008-05-09 18:29 xx

级联删除会吗?  回复  更多评论   

# re: hibernate:one-to-one的学习小经验 2008-08-26 17:34 z60010232

受用了,谢谢  回复  更多评论   

# re: hibernate:one-to-one的学习小经验[未登录] 2009-05-10 09:15

太强了,非常感谢。我看了上面的讲述。问题解决了。谢谢  回复  更多评论   

# re: hibernate:one-to-one的学习小经验 2009-05-15 11:28 jj

不知道one-to-many能不能自动存储  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 
<2009年5月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

导航

统计

公告

If there is any question you have, please don't hesitate, let me know ASAP, you can find me at kenees@gmail.com or QQ: 9808873, hope to make friends with you ;)

常用链接

留言簿(1)

随笔档案

文章档案

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜