[英]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.