Код: Выделить всё
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(cascade=CascadeType.ALL, orphanRemoval=true)
@JoinColumn(name="orderId", nullable=false)
private List items;
}
@Entity
@Data
public class Item {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@EqualsAndHashCode.Exclude
private Long id;
private String description;
}
Код: Выделить всё
public List getItemsIfSame(Order order1, Order order2) {
if (order1.getItems() != null && order1.getItems().equals(order2.getItems())) {
return order1.getItems();
}
return null;
}
Но когда я запускаю свое приложение и ему передаются два заказа с одинаковыми товарами, возвращается значение null. После отладки и исследования я обнаружил, что фактический тип, возвращаемый методом Order getItems, — это org.hibernate.collection.internal.PersistentBag. В его документации указано:
Bag не учитывает API коллекции и выполняет сравнение экземпляров JVM, чтобы получить равные значения. Семантика нарушена, чтобы не инициализировать коллекцию для простой операции равенства().
И, как подтверждается в исходном коде, он просто вызывает метод равенства объекта (хотя он реализует List).
Полагаю, я мог бы скопировать все элементы из PersistentBag в ArrayList, а затем сравнить, но иногда я проверяю равенство объекта, который имеет какое-то вложенное свойство со списком. Есть ли лучший способ проверить равенство списков между объектами?