Я создаю объект объекта базы данных Order
и назначаю его нескольким объектам типа BookingCode
.Cascade persist создает повторяющиеся строки?
Проблема: это создает единый порядок в db, что хорошо. Но сам заказ имеет @OneToOne
OrderDescription
, который встречается дубликат в базе данных.
@Entity
public class BookingCode {
@Id
private Long id;
@ManyToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.DETACH})
private Order order;
}
@Entity
public class Order {
@Id
private Long id;
private String orderName;
@OneToOne(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true)
private OrderDescription description;
}
@Entity
public class OrderDescription {
@Id
private Long id;
//for simplicity just one text element; of course multiple fields in real life
private String text;
@OneToOne
private Order order;
}
Тест:
Order order = new Order();
order.setOrderName("test");
OrderDescription d = new OrderDescription("testdescr");
d.setOrder(order);
order.setDescription(d);
List<BookingCodes> codes = new ArrayList<>();
BookingCode code = new BookingCode();
code.setOrder(order);
codes.add(order);
BookingCode code2 = new BookingCode();
code2.setOrder(order); //using the same offer entity!
codes.add(order2);
codes = dao.save(codes); //CrudRepository from Spring
dao.findOne(codes.get(0).getId()); //this works, find an order which has one of the OrderDescriptions
Результат: В моей базе данных я затем дваOrderDescription
записи, где я ожидал бы только один, потому что я повторно тот же Order
объекта и назначил его к различным BookingCode
объектов.
Как:
table order_descrption:
1;"de";"testdescr";"123456"
2;"de";"testdescr";"123456"
Как Order
имеет @OneToOne
отношение к OrderDescription
И я даже не понимаю, почему select
помощью findOne()
работает корректно. Потому что в базе данных у меня теперь есть два OrderDescriptions
, которые сопоставляются с тем же Order
, но у Order
может быть только один из них.
У вас есть правильный метод hashCode и equals? –
У меня нет методов хэша или равных. Но не должен спящий быть в состоянии обнаружить, что я собираюсь сохранить тот же «Порядок» и в пределах того же «OrderDescription»? – membersound
Не без надлежащих реалий equals/hashcode. JPA довольно придирчив к тому, как это работает. Он заменяет объекты управляемыми объектами, с которых они больше не соответствуют. Без правильных реализаций equals/hashcode hibernate не может обнаружить этого. Предположим, что сначала нужно сохранить порядок, прежде чем что-либо еще. –