Hibernate @Synchronize似乎无法正常工作

时间:2015-07-29 08:19:41

标签: java hibernate jpa

我有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中还有其他方法来处理数据库视图吗? 我错过了别的什么吗?

1 个答案:

答案 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