Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate@Synchronize似乎无法工作_Java_Hibernate_Jpa - Fatal编程技术网

Java Hibernate@Synchronize似乎无法工作

Java Hibernate@Synchronize似乎无法工作,java,hibernate,jpa,Java,Hibernate,Jpa,我有两个实体,一个映射到数据库表,另一个映射到数据库视图。 视图的数据取决于表 @javax.persistence.Table(name = "BOOKING_INFO", schema = "BOOKING") @Entity public class BookingInfo extends AbstractBooking { @javax.persistence.Table(name = "BOOKING_VIEW", schema = "BOOKING") @Entity @Immu

我有两个实体,一个映射到数据库表,另一个映射到数据库视图。 视图的数据取决于表

@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 {
这在大多数情况下都很好,但是当我们写入(插入或更新)Booking实体,然后对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中还有其他处理数据库视图的方法吗?
我还遗漏了什么吗?

多亏了一位同事,我们能够调试并修复这个问题,问题在于我们的Hibernate命名策略将表名小写,因此正确的注释是:

@Synchronize("BOOKING.booking_info")
如何调试:

在Hibernates
ActionQueue
类的
areTablesToBeUpdated
方法中设置断点

在那里,我们看到它将“BOOKING.BOOKING\u VIEW”与“BOOKING.BOOKING\u VIEW”进行了比较

我们认为这是hibernate中的一个bug,因为它应该将命名策略也应用于@Synchronize中的值,或者比较这些不区分大小写的值(如果您有一个疯狂的数据库,它使用的表名称相同,但大小写不同,理论上可能会导致太多刷新)

创建了一个休眠问题: