我有2个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实体上进行查询(在我的情况下是一个计数)时,我们会得到过时的数据。
为什么会发生这种情况对我来说很清楚(休眠缓存,只有当它检测到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中还有其他方法来处理数据库视图吗? 我错过了别的什么吗?
答案 0 :(得分:3)
感谢一位同事,我们能够调试并解决这个问题,问题是我们的Hibernate命名策略降低了我们的表名,所以正确的注释是:
@Synchronize("BOOKING.booking_info")
如何调试:
在ActionQueue
方法中的Hibernates areTablesToBeUpdated
类中设置断点。
我们看到它将“BOOKING.BOOKING_VIEW”与“BOOKING.booking_view”进行了比较。
我们认为这是hibernate中的一个错误,因为它应该将命名策略也应用于@Synchronize中的值,或者比较这些不区分大小写的(如果你有一个使用疯狂的数据库,这理论上会导致太多的刷新具有相同名称的表仅按套管区分。)
创建了一个Hibernate问题:https://hibernate.atlassian.net/browse/HHH-10002