Спящий и равно () - PullRequest
       3

Спящий и равно ()

3 голосов
/ 28 декабря 2010

Возможно, я где-то читал, что:

  1. Hibernate не записывает в базу данных, если сохраняемая сущность не имеет изменений в своем постоянном состоянии в базе данных.
  2. Hibernate использует equals () объекта, чтобы определить, содержит ли он какие-либо изменения в своем постоянном состоянии.

Кто-нибудь может подтвердить или опровергнуть их?

Кроме того, относится ли что-либо из этого к спецификации JPA?

Ответы [ 4 ]

3 голосов
/ 28 декабря 2010
  1. Правильно, если объект был загружен в том же сеансе гибернации. (Если объект был загружен в предыдущем сеансе и был повторно связан с текущим, hibernate больше не имеет старого состояния для сравнения и выдает обновление на всякий случай).

  2. Hibernate записывает значения свойств, которые имел объект, когда он был загружен в сеансе гибернации, и сравнивает текущие значения свойств со старыми значениями свойств, выдавая обновление, если оно грязное. При сравнении старых и новых значений свойств могут использоваться равенства. Равенство не используется для сравнения старого с новым объектом. (Нет "старой сущности"). Соответствующие части спящего источника:

2 голосов
/ 28 декабря 2010

Я полагаю, что в Hibernate есть собственный механизм пометки грязных полей, которые необходимо сохранить в базе данных, и он не включает равных.

Hibernate обсуждает идентичность как правильный способ реализации равных для постоянных объектов. В этом случае достаточно проверки равенства первичных ключей.

1 голос
/ 28 декабря 2010

Первое правильно, но я не уверен насчет второго.

Обычно метод equals() должен быть переопределен для реализации пользовательской логики сравнения, т.е. если у вас есть первичный ключ, то два объекта равны, если они соответствуют ключу, в противном случае вы должны сопоставить их свойства / атрибуты. Поэтому я не думаю , что он используется для обнаружения изменений, даже потому что Hibernate должен был бы извлечь текущий экземпляр из БД, что стоит запроса, когда вы можете сделать UPDATE сразу (но SELECT намного быстрее чем UPDATE)

0 голосов
/ 11 сентября 2012

1).Hibernate грубо выполняет следующие проверки - New Entity: если идентификатор объекта существует.это новый объект, он будет сохранен.- Существующий объект: если идентификатор равен нулю, этот объект не является новым и существует в базе данных.hibernate проверит, изменилось ли какое-либо свойство объекта (измененный флаг), если да, оно будет обновлено в базе данных.

2).Вам необходимо реализовать метод equals, если вы хотите поместить экземпляры на карту и повторно присоединить отдельные экземпляры.Например, у вас есть отдельный объект, который уже существует в базе данных. Если вы хотите присоединить этот объект для его обновления, вы должны реализовать метод equals.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...