2015-07-04 2 views
1

Мне интересно, следует ли проверять равенство отношений в сущности или нет. Предположим, что у меня ниже лиц:Должен ли я проверять коллекции при переопределении значений в единицах?

@Entity 
class A { 
    // ... 

    @OneToMany 
    private List<B> bs = new ArrayList<B>(); 

    @Override 
    public boolean equals(Object obj) { 
     //... 
     A other = (A) obj; 
     if(!bs.equals(other.getBs())) return false; 
     // ... 
    } 
} 

@Entity 
class B { 
    // ... 
} 

Должен ли я проверить равенства bs полей? Это выглядит как-то странно, так как bs может содержать тысячи объектов.

+1

Класс A, вероятно, имеет уникальный идентификатор, не достаточно ли проверить этот идентификатор в методе equals? Кроме того, ALWAYS переопределяет hashcode при переопределении равных. – kevcodez

ответ

1

Независимо от того, проверяете ли вы равноправие всех членов-членов, речь идет о вашем определении равенства. Обратите внимание, что вы не можете правильно переопределить equals() вообще, не переопределяя hashCode(), а также чтобы равные объекты имели одинаковые хэш-коды.

С учетом сказанного мнения могут отличаться от того, стоит ли вообще переопределять эти методы для классов сущности JPA. Если вы переопределите их, то равенство должно, вероятно, основываться только на «бизнес-идентификаторе» - свойстве или свойствах объекта, которые определяют его личность для деловых целей, в отличие от его автогенерируемой ПК. Это делает равенство ответом на вопрос: «Делают объекты E1 и E2 представляют один и тот же постоянный объект» таким образом, который работает, если PKs объектов объекта были прочитаны/назначены или нет. Следуя этому принципу, вы должны указать, что вы не включают в себя элементы связанных коллекций в вашем определении.

Если у вас есть другое представление о равенстве, которое вы хотите оценить, тогда подумайте о предоставлении другого метода для его оценки или даже другого класса, ответственного за выполнение таких сравнений. Возможно, для этой цели может быть присвоен класс вашей организации Comparable.

+0

Хорошо, проверка ключей идентификации имеет смысл, поэтому таким образом отдельный объект с разным состоянием, но равным ключом идентификации с исходным постоянным объектом, равен, правильно? –

+0

Довольно много да, но будьте осторожны: вы, вероятно, хотите учитывать не только отдельные элементы, но и * новые *. Вот в чем смысл оценки деловой идентичности, а не суррогатного ключа. –

Смежные вопросы