Hibernate拦截器获取与加载

Hibernate拦截器获取与加载,hibernate,load,statistics,fetch,interceptor,Hibernate,Load,Statistics,Fetch,Interceptor,我已经编写了一个拦截器来记录onLoad事件,但我希望能够区分加载和回迁——也就是说,Hibernate是否必须从数据库中获取实体,或者是否只是从其缓存之一加载实体 我不能使用Hibernate统计信息的原因是,我希望对导致加载/获取/查询的方法进行更细粒度的分析,这就是我使用拦截器的原因。所以我想我的问题是,如何使用拦截器区分加载和获取 提前谢谢 您可以尝试扩展拦截器,而不是使用拦截器 事件系统为您提供了对实体状态更改事件的更多控制。经过大量的探索,我实际上要寻找的是DefaultLoadEv

我已经编写了一个拦截器来记录
onLoad
事件,但我希望能够区分加载和回迁——也就是说,Hibernate是否必须从数据库中获取实体,或者是否只是从其缓存之一加载实体

我不能使用Hibernate统计信息的原因是,我希望对导致加载/获取/查询的方法进行更细粒度的分析,这就是我使用拦截器的原因。所以我想我的问题是,如何使用拦截器区分加载和获取


提前谢谢

您可以尝试扩展拦截器,而不是使用拦截器


事件系统为您提供了对实体状态更改事件的更多控制。

经过大量的探索,我实际上要寻找的是
DefaultLoadEventListener
中的
loadFromDatasource
。Hibernate将使用
event.isAssociationFetch()
查看是否应在其统计信息中将其记录为提取。重写此方法并添加该检查将准确镜像休眠统计信息

我可以通过以下途径找到此消息:,并使用以下方式注册事件侦听器:


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

我对此API有点困惑——这只是在Hibernate必须从数据库中获取实体时才会被调用,还是在每次实体加载后都会被调用?最好尝试一下,看看它何时被调用。看起来每次加载实体时都会调用postLoad,这不是我想要的。为了测试这一点,我加入了一个原子计数器,并将其与Hibernate的统计数据进行比较。它显示的数字正好等于实体加载的数量,但与实体获取的数量不同。你知道一种只听取事件的方法吗?我不知道是否有这样的事件。啊——那是不幸的。那么Hibernate统计数据是如何跟踪的呢?