【问题标题】:how can I determine whether hibernate has 'lazy' loaded the proxy or the real object?如何确定休眠是否“延迟”加载了代理或真实对象?
【发布时间】:2011-03-18 10:09:45
【问题描述】:

这里是休眠的新手。我正在使用 Hibernate 3.5,据我所知,默认情况下应该使用延迟获取。我通过

启用了 SQL 日志记录
<property name="show_sql">true</property>

我正在请求对象 A,它具有对对象 B 的引用,该对象 B 包含实际的字节数据数组。我将数据推送到对象 B 中,这样除非真的需要,否则不会从数据库中获取数据,但是当我请求对象 A 时,堆会急剧跳跃,就好像它无论如何都获取了数据一样,我从休眠中得到了这个输出SQL 日志记录:

Hibernate: select attachment0_.id as id11_0_, attachment0_.data as data11_0_ from attachment_data attachment0_ where attachment0_.id=?

我不清楚如何解释这一点,特别是“as”语句。 'attachment0.data' 似乎是对象 B 中的字节数组。休眠状态是说它为数组创建了代理,还是说它实际上是从数据库中提取数据?如果它只是创建了一个代理,我会看不到代理的选择输出吗?

所以总而言之,主要问题是如何确定我是否拥有代理或真实对象,以及如何解释 select 语句的相关问题?

我已经深入研究了 hibernate 文档,并在网上搜索了很多信息,但大多数信息似乎比我所缺少的基本知识高出一步,因此非常感谢任何帮助。

【问题讨论】:

  • attachment_data是映射到对象A还是对象B的表?

标签: hibernate lazy-evaluation


【解决方案1】:

您拥有的对象可以是加载所有数据的代理。如果您想取消代理对象,请在 Hibernate 中使用以下内容:

org.hibernate.impl.SessionImpl 你可以得到org.hibernate.engine.PersistenceContext 然后

SessionImpl session = ...;
PersistenceContext persistenceContext = session.getPersistenceContext();
Object entity = persistenceContext.unproxy(maybeProxy);

用于取消代理的 javadoc

/**
 * Get the entity instance underlying the given proxy, throwing
 * an exception if the proxy is uninitialized. If the given object
 * is not a proxy, simply return the argument.
 */
public Object unproxy(Object maybeProxy) throws HibernateException;

【讨论】:

  • 感谢您的回复。你说对象可以是加载所有数据的代理,但这样做有什么意义呢?对象实际上只是一个保存数据和方法的容器,那么在休眠传递代理与真实对象的上下文中,代理和真实对象有什么区别?
  • 让我澄清一下我的意思:首先,您会得到一个代理实例,该实例由 Session.load 按需初始化(假设数据不在一级缓存中)或通过浏览关系.然后当访问代理的属性时,从数据库中获取实体数据。 java 对象实例仍然是一个代理(加载了所有数据),它将继续是一个代理,直到您 unproxy 它。对于休眠,您可以无所谓地使用代理或真实对象。
  • 很有趣,谢谢。只要数据和方法相同,我想我处理的是代理还是真实对象并不重要。
  • @Nr9:我想知道PersistenceContext对象的unproxy方法是深还是阴影? tks.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 2018-10-22
  • 1970-01-01
  • 1970-01-01
  • 2015-01-01
相关资源
最近更新 更多