2016-06-28 2 views
1

Я создаю объект объекта базы данных Order и назначаю его нескольким объектам типа BookingCode.Cascade persist создает повторяющиеся строки?

Проблема: это создает единый порядок в db, что хорошо. Но сам заказ имеет @OneToOneOrderDescription, который встречается дубликат в базе данных.

@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

У меня нет методов хэша или равных. Но не должен спящий быть в состоянии обнаружить, что я собираюсь сохранить тот же «Порядок» и в пределах того же «OrderDescription»? – membersound

+1

Не без надлежащих реалий equals/hashcode. JPA довольно придирчив к тому, как это работает. Он заменяет объекты управляемыми объектами, с которых они больше не соответствуют. Без правильных реализаций equals/hashcode hibernate не может обнаружить этого. Предположим, что сначала нужно сохранить порядок, прежде чем что-либо еще. –

ответ

1

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

+0

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

+0

Для заказа должен быть назначен первичный ключ, чтобы определить, являются ли заказы одинаковыми или нет –

Смежные вопросы