我已经编写了一个拦截器来记录 onLoad
事件,但我希望能够区分加载和获取,即 Hibernate 是否必须从数据库获取实体,或者是否需要从数据库中获取实体。只需从其缓存之一加载它即可。
我无法使用 Hibernate 统计信息的原因是因为我想要更细粒度地分析什么方法导致哪个加载/获取/查询,这就是我使用拦截器的原因。所以我想我的问题是,如何使用拦截器区分加载和获取?
提前致谢!
最佳答案
经过大量研究后,我实际上要寻找的是 DefaultLoadEventListener
中的 loadFromDatasource
。 Hibernate 将使用 event.isAssociationFetch() 来查看是否应将其记录为统计信息中的提取。重写此方法并添加该检查将准确反射(reflect) Hibernate 统计信息。
我能够通过以下方式追踪到这一点:In hibernate statistics whats the difference between load and fetch ,并用此注册事件监听器: eventlisteners using hibernate 4.0 with spring 3.1.0.release?
但是,我注意到的一件事是,您需要清除事件监听器组,否则将会有他们的默认监听器,它将获取对象,并且当您的监听器检查时,它会认为该对象已经被已获取(它已获取),因此不会将其记录在您的统计信息中。
关于Hibernate 拦截器获取与加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23938581/