【问题标题】:Hibernate fetchtype lazy is loading the target object(table) be default?Hibernate fetchtype lazy 正在加载目标对象(表)是默认的吗?
【发布时间】:2015-02-19 08:35:14
【问题描述】:

我有一个 Hibernate 实体,我在数据库中的某些条件下手动定义了一个 Ref Integrity,它可以很好地获取目标实体。

问题是我将该属性的 FetchType 定义为 Lazy。所以理想情况下,它应该只在访问时请求。但是当我获取父实体时,它也会获取映射的实体。

【问题讨论】:

  • @ManyToOne(fetch = FetchType.LAZY) @JoinColumns ({ @JoinColumn(name="WK_SUB_LG_CODE", referencedColumnName = "SUBLANGUAGECODE",updatable = false, insertable = false), @JoinColumn(name= "WK_LG_CODE", referencedColumnName = "LANGUAGECODE",updatable = false, insertable = false) }) public SubLanguage getSubLanguageByWkLgCode() { return subLanguageByWkLgCode; }
  • 你怎么知道它也获取映射的实体?
  • 被引用的实体是否是持久对象层次结构的一部分,即具有子类?
  • @Mayura Nawarathne - 我打开了 show_sql 功能,我可以在获取父实体时看到两个 select 语句。
  • @ThomasStets - 是的,它也有子类,它也可以是某些父对象的一部分。但问题是,我没有获取这个引用的对象,只是访问父对象,它仍然加载。我将 FetchType 指定为 Lazy。

标签: java entity-framework hibernate


【解决方案1】:

在某些情况下,hibernate 不能使用延迟加载,即使你告诉它这样做。一种情况是持久对象的层次结构。

当您为对另一个持久对象的引用指定延迟加载时,hibernate 会创建一个动态代理对象,该对象仅在您实际尝试访问其任何属性时从数据库中填充。

问题是,这个动态代理必须实现(如果您使用接口)或扩展(如果引用指向具体类)要延迟加载的类。当类是持久层次结构的超类时,休眠不知道分别是哪个接口。要实现的类。

示例: 您有持久类 A、B、C、X,如下所示:

class A {}
class B extends A {}
class C extends B {}

class X {
   A a;
   getA() { return a;}
}

你告诉 hibernate 对 X 中的属性 a 使用延迟加载。 现在你想做这样的事情:

X x = ...; // load from DB
A a = x.getA();

if (a instanceof B) { ... }
else if (a instanceof C) { ... }

如果 a 被延迟加载,x.getA() 将返回一个动态代理。但是hibernate怎么知道代理是B还是C呢?唯一的办法是实际从数据库中加载相关数据进行检查。而且由于它无论如何都必须去数据库,所以它不需要代理,只需加载完整的对象。

【讨论】:

  • 这似乎是一个条件,我正在探索更多的方法来做到这一点。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-31
  • 1970-01-01
  • 2017-01-01
  • 2012-03-18
  • 2012-03-04
  • 1970-01-01
相关资源
最近更新 更多