Hibernate / JPA Parent-Child - нормально ли для Parent equals () / hashCode () использовать идентификатор БД? - PullRequest
3 голосов
/ 27 мая 2009

Учитывая следующее:

@Entity
public class Parent implements Serializable {
  @Id
  private Long id;
  // mapped ManyToOne below...
  private List<Child> children = new ArrayList<Child>();

  ...

}

Это плохая практика, когда Parent.equals () и Parent.hashCode () используют только id? Я понимаю, что Child.equals () и Child.hashCode () должны использовать неизменяемый набор атрибутов для «естественного ключа», чтобы они правильно управлялись Parent. Однако, если Parent всегда является объектом верхнего уровня (т.е. это никогда не обратная сторона какой-либо ассоциации), есть ли что-то не так с использованием только id?

Есть ли какие-либо нежелательные эффекты, которые могут проявиться при этом? Я предполагаю, что, может быть, если я сделаю это, то, когда я добавлю дочерний элемент (или удалим), Hibernate не сможет сказать, что родитель изменился (и должен быть обновлен в БД)? В этом случае я должен использовать свойство children для Parent.equals () и Parent.hashCode ()?

Я спрашиваю, потому что в документах Hibernate говорится, что не следует использовать свойство @Id для «естественного ключа» ...

1 Ответ

5 голосов
/ 27 мая 2009

Основная проблема с использованием идентификатора как равного и hashCode - это непрошеные объекты. Предположительно, все эти объекты начинаются с одного и того же идентификатора, и это нельзя правильно сравнить на равенство. Даже если вы никогда не помещаете объекты в коллекцию, если они открываются через API, и кто-то другой может создать их экземпляр и поместить в коллекцию, вы столкнулись с некоторыми неприятными ошибками.

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