我有两个Entitites,一个映射到一个数据库表,另一个映射到一个数据库视图。视图的数据取决于表。
@javax.persistence.Table(name = "BOOKING_INFO", schema = "BOOKING")
@Entity
public class BookingInfo extends AbstractBooking {
@javax.persistence.Table(name = "BOOKING_VIEW", schema = "BOOKING")
@Entity
@Immutable
public class BookingView extends AbstractBooking {
在大多数情况下,这很好,但是当我们编写(插入或更新)预订实体,然后对BookingView实体执行查询(在我的例子中是计数)时,就会得到陈旧的数据。
我很清楚为什么会发生这种情况(hibernate缓存,它只在检测到select需要刷新一些数据时才会刷新)。因此,如果我对预订实体执行查询,就会触发刷新。
我在Hibernate中找到了@Synchronize
注释,听起来应该可以解决这个问题,如下所示:
@javax.persistence.Table(name = "BOOKING_VIEW", schema = "BOOKING")
@Entity
@Immutable
@Synchronize("BOOKING.BOOKING_INFO")
public class BookingView extends AbstractBooking {
但是,这并没有什么区别(只有在事务结束时才会发生刷新)。另外,我发现关于这个注释的文档非常缺乏,也没有多大帮助。
编辑:我也尝试了@Synchronize("BOOKING_INFO")
(没有模式名称,也没有小写,但这没有什么区别)
文档说,它主要与@Subselect
一起使用,但它不是必须的(我不想那样)。
有没有人成功地使用过这个注释?还有其他方法来处理Hibernate中的数据库视图吗?我是不是漏了什么东西?
发布于 2015-07-30 09:44:45
由于我们的一位同事能够调试和修复这个问题,问题是我们的Hibernate命名策略降低了我们的表名,所以正确的烦恼是:
@Synchronize("BOOKING.booking_info")
如何调试:
在ActionQueue
方法中的Hibernates areTablesToBeUpdated
类中设置断点。
在这里我们看到它把"BOOKING.booking_view“和"BOOKING.BOOKING_VIEW”相提并论。
我们认为这是hibernate中的一个bug,因为它应该将命名策略也应用于@Synchronize中的值,或者比较这些不区分大小写的值(理论上,如果您有一个疯狂的数据库,使用同名的表只能用大小写来区分,理论上可能会导致太多刷新)。
创建了Hibernate问题:https://hibernate.atlassian.net/browse/HHH-10002
https://stackoverflow.com/questions/31694987
复制相似问题