首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Hibernate @Synchronize似乎不起作用

Hibernate @Synchronize似乎不起作用
EN

Stack Overflow用户
提问于 2015-07-29 08:19:40
回答 1查看 789关注 0票数 2

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

代码语言:javascript
运行
复制
@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注释,听起来应该可以解决这个问题,如下所示:

代码语言:javascript
运行
复制
@javax.persistence.Table(name = "BOOKING_VIEW", schema = "BOOKING")
@Entity
@Immutable
@Synchronize("BOOKING.BOOKING_INFO")
public class BookingView extends AbstractBooking {

但是,这并没有什么区别(只有在事务结束时才会发生刷新)。另外,我发现关于这个注释的文档非常缺乏,也没有多大帮助。

编辑:我也尝试了@Synchronize("BOOKING_INFO") (没有模式名称,也没有小写,但这没有什么区别)

文档说,它主要与@Subselect一起使用,但它不是必须的(我不想那样)。

有没有人成功地使用过这个注释?还有其他方法来处理Hibernate中的数据库视图吗?我是不是漏了什么东西?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-30 09:44:45

由于我们的一位同事能够调试和修复这个问题,问题是我们的Hibernate命名策略降低了我们的表名,所以正确的烦恼是:

代码语言:javascript
运行
复制
@Synchronize("BOOKING.booking_info")

如何调试:

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

在这里我们看到它把"BOOKING.booking_view“和"BOOKING.BOOKING_VIEW”相提并论。

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

创建了Hibernate问题:https://hibernate.atlassian.net/browse/HHH-10002

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31694987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档