Hibernate和equals()

时间:2010-12-27 22:22:33

标签: java hibernate jpa

我可能会读到某个地方:

  1. 如果要保存的实体没有更改数据库中的持久状态,Hibernate不会写入数据库。
  2. Hibernate使用实体的equals()来确定它是否包含对其持久状态的任何更改。
  3. 任何人都可以确认或拒绝吗?

    此外,这些都适用于JPA规范吗?

4 个答案:

答案 0 :(得分:3)

  1. 如果实体已在同一个hibernate会话中加载,则表示正确。 (如果实体已在前一个会话中加载,并与当前会话重新关联,则hibernate不再具有旧状态进行比较,并发出更新以防万一)。

  2. Hibernate记录对象在hibernate会话中加载时的属性值,并将当前属性值与旧属性值进行比较,如果有任何脏的话,则会发出更新。比较旧属性值和新属性值时,可以使用equals。等于用于比较旧实体和旧实体。 (没有“旧实体”)。休眠源的相关部分:

答案 1 :(得分:2)

我相信Hibernate有自己的机制来标记需要持久存储到数据库的脏字段,并且它不涉及equals。

Hibernate有一些关于身份的讨论是实现持久对象等于的正确方法。在这种情况下,检查equality主键就足够了。

答案 2 :(得分:1)

首先是正确的,但我不确定第二个。

通常,应该覆盖equals()方法来实现自定义比较逻辑,即。如果你有主键,那么如果它们与键匹配则两个对象相等,否则你必须匹配它们的属性/属性。这就是为什么我认为它用于检测更改的原因,即使因为Hibernate必须从DB中检索当前实例,当您可以立即执行UPDATE时(这需要花费查询)但是SELECTUPDATE

快得多

答案 3 :(得分:0)

1)。 Hibernate大致进行以下检查   - 新实体:如果存在对象的id。它是一个新的对象,它将被保存。   - 现有实体:如果id为null,则该对象不是新对象,并且存在于数据库中。 hibernate将检查对象的任何属性是否已更改(脏标志),如果是,它将在数据库中更新。

2)。如果您打算将实例放入映射并且意图重新连接已分离的实例,则需要实现equals方法。例如,如果要附加此对象以便更新它,则数据库中已存在已分离的对象,则必须实现equals方法。

请参阅http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html/ch04.html#persistent-classes-equalshashcode