免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1596 | 回复: 0
打印 上一主题 下一主题

hibernate问题- 一对一主键延迟加载(转) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-03 14:35 |只看该作者 |倒序浏览


转自:
http://esffor.javaeye.com/blog/96326
方法是:在主控方的上加constrained=true,在被控方的class上加lazy=true,其实这个方法是可以的
我们都知道,一对一有两种实现方式,主键关联和外键关联
主键关联:就是说两个表的主键是一样的
                    product(id,name)   image(id,name)
                    其中image的id引用product的id,product是主,image是次
外键关联:就是说是通过一个字段引用另一个表的主键
                    product(id,name)   image(id,name,productid)
                    其中image的productid引用product的id,product是主,image是次

在主键关联时,按如下进行实体映射,是可以实现延迟加载的

hibernate-mapping package="onetoonebypk">

  class name="Product1" table="product1">

    id name="id" unsaved-value="null">

      column name="id">column>

      generator class="uuid.hex">generator>

    id>

    property name="name" column="name">property>

     one-to-one name="image1"

                class="Image1"

                cascade="all"

                constrained="true"

               

>

    one-to-one>


  class>


hibernate-mapping>


hibernate-mapping package="onetoonebypk"  >

  class name="Image1" table="image1" lazy="true">

    id name="id">

      generator class="foreign">

        param name="property">product1param>

      generator>

    id>

    property name="name" column="name">property>

     one-to-one name="product1"

                 class="Product1"

                 cascade="all">

    one-to-one>

     

  class>


hibernate-mapping>
当使用外键关联是,如果按如下方式编写映射文件,使不能进行延迟加载的

hibernate-mapping package="onetoonebyfk"  >

  class name="Image" table="image" lazy="true">

    id name="id">

      generator class="uuid.hex"/>

    id>

    property name="name" column="name">property>

     many-to-one name="product"

                 class="Product"

                 unique="true"



                 column="productid">            

     many-to-one>

  class>


hibernate-mapping>


hibernate-mapping package="onetoonebyfk">

  class name="Product" table="product">

    id name="id" unsaved-value="null">

      column name="id">column>

      generator class="uuid.hex">generator>

    id>

    property name="name" column="name">property>

    one-to-one name="image"

                class="Image"

                cascade="all"

                constrained="true"

               property-ref="product"

                >

    one-to-one>

  class>


hibernate-mapping>

为什么呢,我认为是在主方product中,有这样一句话property-ref="product"
这句话的意思是说加外键关联类的属性,如果不指定这个属性,关联类的主键就会被使用
也就是说,如果不制定这个,在查找image时就会使用
select * from image where imageid==product_id 而不是
select * from image where productid==product_id
我们在知道product_id的时候,需要找image中productid等于product_id记录,而不是用image的主键作为比较
去掉propery-def后,倒是可以延迟加载,但在读取product.getImage()方法时会报没有指定id记录的异常,不过这也正常,我们怎么能用image的主键和product_id建立查询条件呢
至于为什么这样,我不是很清楚
总之:我目前的结论是:用主键关联,可以延迟加载,用外键关联,暂时不考虑延迟加载
至于为什么,希望能到大家的帮助


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/101592/showart_2016279.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP