Hibernate Interceptor Fetch vs Load

时间:2014-05-29 16:50:18

标签: hibernate load statistics fetch interceptor

我编写了一个拦截器来记录onLoad事件,但我希望能够区分负载和提取 - 即Hibernate是否必须从数据库中获取实体,或者是否只是加载它来自其中一个缓存。

我无法使用Hibernate统计信息的原因是因为我想对导致哪种加载/获取/查询的方法进行更细粒度的分析,这就是我使用拦截器的原因。所以我想我的问题是,如何使用拦截器来区分负载?

提前致谢!

2 个答案:

答案 0 :(得分:2)

经过大量的讨论,我实际需要的是loadFromDatasource DefaultLoadEventListener。 Hibernate将使用event.isAssociationFetch()来查看它是否应该将其记录为统计信息中的fetch。覆盖此方法并添加该检查将完全镜像Hibernate Statistics。

我能够通过以下方式跟踪此问题:In hibernate statistics whats the difference between load and fetch,以及注册的事件监听器:eventlisteners using hibernate 4.0 with spring 3.1.0.release?

然而,我注意到的一件事是你要清除事件监听器组,否则会有他们的默认监听器,它将获取对象,当你的监听器检查时,它会认为对象已经被已获取(已具有),因此不会将其记录在统计信息中。

答案 1 :(得分:0)

您可以尝试扩展DefaultPostLoadEventListener

,而不是使用拦截器

事件系统使您可以更好地控制实体状态更改事件。