2016-06-28 55 views
1

我正在創建數據庫實體對象Order,並將其分配給BookingCode類型的多個實體。級聯堅持創建重複的行?

問題:這會在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 我甚爲什麼使用findOne()作品正確select不明白。因爲在數據庫中我現在有兩個OrderDescriptions映射到相同的Order,但Order只能有其中之一。

+0

你有一個正確的hashCode和equals方法嗎? –

+0

我沒有任何散列或等於方法。但是不應該hibernate能夠檢測到我要保存相同的'Order'並且在同一個'OrderDescription'中? – membersound

+1

沒有正確的equals/hashcode實現。 JPA對它的工作原理相當挑剔。它將管理對象的對象替換爲不匹配的對象。如果沒有適當的equals/hashcode實現,hibernate無法檢測到這一點。因此,建議首先在其他任何事情之前堅持訂單。 –

回答

1

先保留訂單,然後將其分配給兩個bookingCode。

+0

工作,謝謝。無論如何,我想知道是否仍然可以一次性保存這些對象。 – membersound

+0

應該有一個主鍵分配給訂單,以確定訂單是否相同 –