Каскадное сохранение создает повторяющиеся строки?

2

Я создаю объект сущности базы данных 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 может иметь только один из них.

  • 0
    У вас есть правильный hashCode и метод equals?
  • 0
    У меня нет методов хеширования или равенства. Но разве hibernate не сможет обнаружить, что я собираюсь сохранить тот же Order и в том же OrderDescription ?
Показать ещё 1 комментарий
Теги:
spring

1 ответ

2
Лучший ответ

Перенесите заказ сначала, а затем назначьте его для обоих bookingCode.

  • 0
    Это работает, спасибо. В любом случае мне интересно, возможно ли сохранить эти объекты за один раз?
  • 0
    Для заказа должен быть назначен первичный ключ, чтобы определить, являются ли заказы одинаковыми или нет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню