`

Hibernate Lazy加载导致的OO不完全实现

阅读更多

转自: http://www.sulong.info/archives/335

 

对象和关系型数据库之间存在着根本不同, ORM(对象/关系映射)试图把对象映射到关系型数据库的表结构上,从而简化存储对象到数据库及从数据库中恢复对象的复杂性,让操作数据库就像操作对象一样简单。Hibernate估计是众多ORM框架中最成熟的了,但是在处理类的继承关系时还是会有一些问题。

延迟加载与继承
先看如下的代码, 演示这一映射关系:

@Entity
@Table(name = "a")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
		name = "disc", 
		columnDefinition = "varchar(4)", 
		discriminatorType = DiscriminatorType.STRING)
public abstract class A {
 @Id
 private int oid;
 private String name;
}
 
@Entity
@DiscriminatorValue("b")
public class B extends A {
private String age;
}
 
@Entity
@DiscriminatorValue("c")
public class C extends B {
private String sex;
}
 
@Entity
@Table(name = "d")
public class D {
  @Id
  private int oid;
  @ManyToOne(fetch = FetchType.LAZY)
  private A a;
  public A getA() {return a}
}
 

 

当查询 D类时,应为 D.a 是延迟加载的,所以没有查询过 a表,自然就不知道该记录对应的disc为什么值,也不知道A具体是哪种子类类型。但是查询出的d对象,如果 d.a != null d.a必须有值。Hibernate会生成一个A的子类,并用它的实例作为 d.a 当你真的要访问 d.a 的方法或域时,hibernate才会真正的去查询 a 表。 这其实就是hibernate实现延迟加载的原理。但在本例中,如果你执行如下代码就会遇到 ClassCastException,

D d = session.load(D.class, 1);
C c = (C) d.getA(); //即使d.getA()确实是C类型,也会ClassCastException 
 

hibernate生成的是A的子类,而不是B或C的子类,所以在类型转换的时候出错了。要解决这一问题,要么不要用延迟加载, 但是性能上面很可能出问题;要么不要用继承,向下面这样:

@Entity
@Table(name = "a")
public abstract class A {
 @Id
 private int oid;
 
 private String name;
 private String age;
 private String sex;
}
 
 
@Entity
@Table(name = "d")
public class D {
  @Id
  private int oid;
  @ManyToOne(fetch = FetchType.LAZY)
  private A a;
  public A getA() {return a}
} 
 

这样实际上是限制OO的能力;要么每次都显示的重新查询改对象,向这样:

D d = session.load(D.class, 1);
C c = session.load(C.class, d.getA().getOid()) //重新查,指明类型 
 

这样做既不方便,又不OO。

看来要想让hibernate的映射类保持对象的特性,还是有些困难的。很多时候,这些映射类最终就变成了只负责映射功能的数据库表对象了

分享到:
评论

相关推荐

    Hibernate lazy加载FOR Connection

    标题中的“Hibernate lazy加载FOR Connection”指的是Hibernate框架中的一种特性,即懒加载(Lazy Loading)。在Hibernate中,懒加载是一种优化策略,它推迟对关联对象的加载,直到真正需要使用这些对象时才进行加载...

    Hibernate lazy延迟加载

    **标题**: Hibernate懒加载(Lazy Loading) 在Java的持久化框架Hibernate中,懒加载(Lazy Loading)是一种重要的优化策略,它的核心思想是“延迟加载”或“按需加载”。默认情况下,当一个实体被加载时,并不会...

    gilead hibernate lazyload例子

    总的来说,Gilead和Hibernate的懒加载结合使用,可以在Flex应用程序中实现高效的数据加载策略,同时通过合理处理Gilead库文件大小问题,提升开发效率和用户体验。但要注意,过度依赖懒加载可能会增加远程调用的次数...

    Hibernate延时加载与lazy机制.doc

    Hibernate的延迟加载(Lazy Loading)和懒加载机制(Lazy Initialization)是优化ORM框架性能的重要策略。这个机制的主要目的是提高程序的效率,减少不必要的数据库交互,只在真正需要数据时才去加载它们。以下是对...

    Hibernate延迟加载以及利用Spring

    #### 二、Hibernate配置中的延迟加载实现 在Hibernate的配置文件或映射文件中,可以设置关联对象的加载策略为延迟加载。比如在给定的部分内容中,`...

    hibernate 延迟加载深入剖析

    ##### 2.2 Hibernate中的延迟加载实现原理 在Hibernate中,延迟加载是通过代理模式实现的。当Hibernate加载一个实体时,默认不会立即加载其关联的实体或集合属性。相反,它会创建一个代理对象来表示这些属性。当...

    hibernate 中的lazy属性祥解.txt

    当一个对象被加载时,与其关联的对象不一定立即加载到内存中,而是等到真正需要使用时才加载,这就是懒加载(Lazy Loading)的基本思想。这一策略对于提高系统性能和减少内存占用具有重要意义。 #### Lazy Loading...

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

    总的来说,Hibernate的延迟加载是通过在映射文件中配置延迟加载策略,以及利用Java动态代理技术,实现对集合属性的按需加载。它降低了系统的内存压力,提高了数据库操作的效率,是Hibernate优化性能的重要手段之一。...

    hibernate延迟加载解决

    这是因为,如果不使用延迟加载,加载一个实体可能会导致所有相关联的实体都被加载到内存中,从而严重影响性能。 **配置方式:** 要启用集合类型的延迟加载,需要在映射文件中为集合元素添加`lazy="true"`属性,...

    Dwr+Hibernate的Lazy问题

    DWR 是一种让 JavaScript 在浏览器中直接调用服务器端 Java 方法的技术,而 Hibernate 是一个流行的Java持久化框架,它支持对象关系映射(ORM)以及延迟加载(Lazy Loading)功能。 在描述中提到的问题是,当使用...

    hibernate懒加载策略.doc

    这些集合在初始化时不加载元素,只有在迭代或访问集合内的元素时,才触发数据库查询加载相关数据。 - 在一对多关联中,如果配置了懒加载,那么在加载父对象(如部门)时,不会立即加载所有子对象(如员工)。只有当...

    懒加载案例lazyload

    懒加载(Lazy Load)是一种优化网页性能的技术,它主要用于图片、视频或JavaScript等资源的加载。在网页初次加载时,并不立即加载所有内容,而是只加载用户可视区域内的元素,当用户滚动页面到某一位置或者触发特定...

    hibernate的lazy策略forClass

    在Java的持久化框架Hibernate中,懒加载(Lazy Loading)是一种重要的对象关系映射策略,用于提高应用程序的性能。懒加载的基本思想是延迟加载,即当真正需要数据时,才去数据库加载。在这个场景中,我们关注的是...

    集成spring的hibernate懒加载

    但这可能导致性能下降,因为即使不需要关联对象,也会加载它们。 3. **Hibernate的Hibernate.initialize()方法**:在需要使用懒加载属性的地方,手动调用此方法初始化代理对象。但这需要在业务代码中显式处理,不够...

    hibernate在集合上的lazy策略

    在Java的持久化框架Hibernate中,懒加载(Lazy Loading)是一种优化策略,它允许我们推迟对关联对象的加载,直到真正需要它们的时候。标题“hibernate在集合上的lazy策略”指的是Hibernate如何处理与实体相关的集合...

    lazyload异步加载图片

    本文将围绕"lazyload异步加载图片"这一主题,深入探讨其原理、实现方式以及实际应用中的注意事项。 ### 1. 基本原理 懒加载的核心思想是延迟加载,即不一次性加载所有图片,而是当图片进入用户的可视区域时才进行...

    hibernate抓取策略和懒加载案例

    2. Lazy Fetching(懒加载):主对象加载时不加载关联对象,只有在真正需要时才执行额外的SQL查询来获取。这是Hibernate的默认策略,有助于减少不必要的数据库交互。 3. Batch Fetching(批量加载):通过一次查询...

    hibernate 延迟加载.docx

    在Java的持久化框架Hibernate中,延迟加载(Lazy Loading)是一种优化数据库访问性能的技术。它允许我们在需要时才加载关联的对象,而不是在初始查询时就一次性加载所有数据。这有助于减少不必要的数据库交互,从而...

Global site tag (gtag.js) - Google Analytics