`
esffor
  • 浏览: 1367498 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于Hibernate一对一不能延迟加载的总结

阅读更多

方法是:在主控方的<one-to-one>上加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">product1</param>
      
</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建立查询条件呢

至于为什么这样,我不是很清楚

总之:我目前的结论是:用主键关联,可以延迟加载,用外键关联,暂时不考虑延迟加载

至于为什么,希望能到大家的帮助

                    



分享到:
评论
2 楼 gaia 2012-08-13  
很有用,谢谢
1 楼 young7 2009-03-01  
不行阿,我这样做在基于主键关联时候还是实现不了延迟加载

相关推荐

    hibernate 延迟加载深入剖析

    本文将对Hibernate中的延迟加载技术进行深入剖析,帮助读者更好地理解和运用这项技术。 #### 二、基本概念 ##### 2.1 什么是延迟加载? 延迟加载是指在访问关联数据或集合数据时,只有在真正需要使用这些数据时才...

    hibernate延迟加载解决

    对于一对多关系或者多对多关系中的集合,延迟加载同样重要。这是因为,如果不使用延迟加载,加载一个实体可能会导致所有相关联的实体都被加载到内存中,从而严重影响性能。 **配置方式:** 要启用集合类型的延迟...

    Hibernate 延迟加载剖析与代理模式应用

    在Java的持久化框架Hibernate中,延迟加载(Lazy Load)是一项重要的优化策略,其核心目标是提高系统性能,减少内存占用,避免不必要的数据库交互。延迟加载允许我们在需要使用数据时才从数据库中加载,而不是在加载...

    Hibernate延迟加载以及利用Spring

    在Hibernate中,延迟加载主要用于关联对象的加载,例如一对多或多对多的关系。默认情况下,当Hibernate查询一个实体时,会同时加载与该实体相关的所有关联对象。但在某些场景下,我们可能并不需要立即获取这些关联...

    Hibernate集合属性的延迟加载.doc

    当我们处理与实体相关的集合属性时,如一对多、多对一或多对多关系,延迟加载尤其有用。 在给定的文档中,我们看到一个例子,展示了如何在 Hibernate 中配置一个具有集合属性的实体类 `Person`,以及如何通过映射...

    Hibernate一对一关联映射(注解)

    ### Hibernate一对一关联映射原理 一对一关联映射是指在数据库中两个表之间存在一对一的关系,例如,一个人只有一个身份证,一个身份证也只属于一个人。在Hibernate中,我们可以通过@OneToOne注解来实现这种映射。 ...

    【北大青鸟内部教程】jsp中关于Hibernate延时加载的问题

    在Hibernate中,一对多、多对一和多对多关系通常可以配置为延时加载。 在JSP中使用Hibernate,开发者可能会遇到以下几种常见的延时加载问题: 1. **空指针异常**:如果没有正确地处理延时加载,当尝试访问未加载的...

    详解Hibernate一对一映射配置

    在Java持久化框架Hibernate中,一对一(One-to-One)映射是对象关系映射的一种常见方式,用于表示两个实体之间一对一的关系。这种关系通常出现在一个实体的实例只能与另一个实体的单个实例相关联的情况。下面我们将...

    hibernate一对一之唯一外键关联(双向关联)

    总结,Hibernate的一对一唯一外键关联为开发者提供了一种方便的方式来处理两个实体之间的紧密联系。无论是在单向还是双向关联中,理解其配置、映射以及性能影响都是至关重要的。通过熟练掌握这些知识,我们能够更好...

    Hibernate 简单 PPT 总结

    在Hibernate中,`inverse`属性是一个关键的概念,它用于定义一对多或多对一关系中的维护端。`inverse="true"`表示另一端负责维护关联关系,这在处理关联实体的保存和更新时具有重要意义。例如,如果你有一个学生类和...

    Hibernate 一对一

    深入理解 Hibernate 一对一映射的实现原理,需要阅读 Hibernate 源码,了解其如何生成 SQL 以及如何处理关联对象的加载和更新。 **总结** Hibernate 的一对一映射是 ORM 设计中的重要部分,它使得数据访问更加便捷...

    Hibernate 延迟加载

    - **一对一映射(One-to-One)**:在一对一映射中,可以使用`constrained`属性配合`lazy`属性来实现懒加载。具体而言,当`constrained`属性设置为`true`时,并且`lazy`属性启用,表示该关联将采用懒加载策略。 - **...

    Hibernate延迟加载

    3. 集合延迟加载:对于一对多(、)和多对一关系,可以设置`lazy="true"`、`lazy="false"`或`lazy="extra"`。`lazy="true"`会在集合被访问时加载,`lazy="false"`会在加载实体时同时加载集合,而`lazy="extra"`提供...

    hibernate 延迟加载.docx

    2. 一对多关联:`lazy="true"`(延迟加载)、`lazy="extra"`(增强延迟加载,只获取部分信息)或`lazy="false"`(立即加载),默认为`true`。 3. 多对一关联:`lazy="proxy"`(延迟加载)、`lazy="no-proxy"`(无...

    Hibernate延迟加载介绍.doc

    对于集合类型的延迟加载,如一对多的关系,Hibernate通过自定义集合类的实现来实现这一功能。例如,在User实体类中,有一个名为`addresses`的Set集合,映射配置如下: ```xml ``` 这里的`lazy="true"`使得...

    Flex 与 Hibernate 的延迟加载问题

    在开发Flex与Hibernate集成的应用时,延迟加载(Lazy Loading)是一个常见的挑战,因为Flex客户端无法直接理解和处理Hibernate的延迟加载机制。延迟加载是一种优化策略,它允许关联的对象在真正需要时才被加载,而...

    hibernate属性延时加载如何操作、相应的jar包

    hibernate3的属性延时加载是个很有意义的东西,它能让你把你不想加载到内存里的东西在查询的时候排除。 我相信来下载这个东西的人都已经很了解这一块的知识了,只是配不对那个类增强器才来下载我这个文件。 这些...

    hibernate延迟加载

    ### Hibernate延迟加载详解 #### 一、概述 Hibernate 是一种常用的 Java 持久层框架,它能够将 Java 应用程序与底层数据库之间建立桥梁,简化数据访问逻辑。为了提高应用程序性能,Hibernate 提供了多种优化手段,...

Global site tag (gtag.js) - Google Analytics