繁体   English   中英

在Hibernate中使用@Synchronize有什么用处

[英]What is the use of @Synchronize in Hibernate

根据Hibernate文档

Hibernate映射的视图和基表之间没有区别。 这在数据库级别是透明的,尽管某些DBMS不能正确支持视图,尤其是对于更新。 有时您希望使用视图,但无法在数据库中创建视图(即使用旧模式)。 在这种情况下,您可以使用@ org.hibernate.annotations.Subselect将不可变和只读实体映射到给定的SQL子选择表达式:

@Entity
@Subselect("select item.name, max(bid.amount), count(*) "
        + "from item "
        + "join bid on bid.item_id = item.id "
        + "group by item.name")
@Synchronize( {"item", "bid"} ) //tables impacted
public class Summary {
    @Id
    public String getId() { return id; }
    ...
}

声明表以与此实体同步,确保自动刷新正确发生,并且针对派生实体的查询不返回过时数据。 可用作属性和嵌套映射元素。

我不清楚同步注释的声明在这里。 自动刷新有什么问题? 这里派生的实体是什么?为什么我们会得到过时的数据? 同步注释如何解决此问题。

有人可以帮助我理解这一点。

Hibernate实体在内存中保持持久状态。 对这些实体的任何更改都会自动保持对数据库的持久性。 但是每次更改实体字段时都不会更新数据库。 它是在刷新时完成的:Hibernate决定它必须使内存中的更改持久化,从而执行适当的insert,update和delete语句,以便数据库状态与内存中状态匹配。

什么时候发生?

  • 在事务提交之前
  • 当您在会话上显式调用flush()
  • 何时执行对修改实体的查询

让我们重点关注第三项。 假设您有一个Order实体,映射到订单表。 假设您已按ID加载订单并修改其金额。 修改仅在内存中。 现在执行以下查询:

select sum(o.amount) from Order o

显然,此查询的结果取决于修改后的实体的新数量。 在执行查询之前,Hibernate会检测到这一点并刷新对Order实体的更改,以确保查询返回正确的结果。 如果查询已经

select c from Customer c where c.name = 'John'

在执行查询之前,Hibernate不会刷新对Order实体的更改,因为其结果不依赖于订单金额的新值:订单表不参与此查询。

现在回答您的问题:由于Hibernate没有@Table注释来知道摘要映射到哪个表,因此在执行涉及Summary实体的查询之前,它不知道何时应该自动刷新。 同步注释允许告知Hibernate:此实体从项目和投标表中获取数据,因此如果针对Summary实体执行查询,请确保在执行查询之前刷新对bid和items表的更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM