Как работать с PersistentBag Hibernate, не подчиняющимся контракту List равно?JAVA

Программисты JAVA общаются здесь
Anonymous
Как работать с PersistentBag Hibernate, не подчиняющимся контракту List равно?

Сообщение Anonymous »

У меня есть сущность со списком:

Код: Выделить всё

@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;
}
У меня есть модульный тест, в котором order1 и order2 содержат одни и те же элементы. И, как и ожидалось, список элементов возвращается методом getItemsIfSame.

Но когда я запускаю свое приложение и ему передаются два заказа с одинаковыми товарами, возвращается значение null. После отладки и исследования я обнаружил, что фактический тип, возвращаемый методом Order getItems, — это org.hibernate.collection.internal.PersistentBag. В его документации указано:


Bag не учитывает API коллекции и выполняет сравнение экземпляров JVM, чтобы получить равные значения. Семантика нарушена, чтобы не инициализировать коллекцию для простой операции равенства().


И, как подтверждается в исходном коде, он просто вызывает метод равенства объекта (хотя он реализует List).

Полагаю, я мог бы скопировать все элементы из PersistentBag в ArrayList, а затем сравнить, но иногда я проверяю равенство объекта, который имеет какое-то вложенное свойство со списком. Есть ли лучший способ проверить равенство списков между объектами?

Вернуться в «JAVA»