Я создаю объект сущности базы данных Order
и назначить его несколько лиц типа BookingCode
.
Проблема: это создает единый порядок в 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
может иметь только один из них.
Перенесите заказ сначала, а затем назначьте его для обоих bookingCode.
Order
и в том жеOrderDescription
?