我编写了一个拦截器来记录onLoad
事件,但我希望能够区分负载和提取 - 即Hibernate是否必须从数据库中获取实体,或者是否只是加载它来自其中一个缓存。
我无法使用Hibernate统计信息的原因是因为我想对导致哪种加载/获取/查询的方法进行更细粒度的分析,这就是我使用拦截器的原因。所以我想我的问题是,如何使用拦截器来区分负载?
提前致谢!
答案 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。
,而不是使用拦截器事件系统使您可以更好地控制实体状态更改事件。