我可能会读到某个地方:
任何人都可以确认或拒绝吗?
此外,这些都适用于JPA规范吗?
答案 0 :(得分:3)
如果实体已在同一个hibernate会话中加载,则表示正确。 (如果实体已在前一个会话中加载,并与当前会话重新关联,则hibernate不再具有旧状态进行比较,并发出更新以防万一)。
Hibernate记录对象在hibernate会话中加载时的属性值,并将当前属性值与旧属性值进行比较,如果有任何脏的话,则会发出更新。比较旧属性值和新属性值时,可以使用equals。等于不用于比较旧实体和旧实体。 (没有“旧实体”)。休眠源的相关部分:
答案 1 :(得分:2)
我相信Hibernate有自己的机制来标记需要持久存储到数据库的脏字段,并且它不涉及equals。
Hibernate有一些关于身份的讨论是实现持久对象等于的正确方法。在这种情况下,检查equality主键就足够了。
答案 2 :(得分:1)
首先是正确的,但我不确定第二个。
通常,应该覆盖equals()
方法来实现自定义比较逻辑,即。如果你有主键,那么如果它们与键匹配则两个对象相等,否则你必须匹配它们的属性/属性。这就是为什么我认为它用于检测更改的原因,即使因为Hibernate必须从DB中检索当前实例,当您可以立即执行UPDATE
时(这需要花费查询)但是SELECT
比UPDATE
)
答案 3 :(得分:0)
1)。 Hibernate大致进行以下检查 - 新实体:如果存在对象的id。它是一个新的对象,它将被保存。 - 现有实体:如果id为null,则该对象不是新对象,并且存在于数据库中。 hibernate将检查对象的任何属性是否已更改(脏标志),如果是,它将在数据库中更新。
2)。如果您打算将实例放入映射并且意图重新连接已分离的实例,则需要实现equals方法。例如,如果要附加此对象以便更新它,则数据库中已存在已分离的对象,则必须实现equals方法。