我正在創建數據庫實體對象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
我甚爲什麼使用findOne()
作品正確select
不明白。因爲在數據庫中我現在有兩個OrderDescriptions
映射到相同的Order
,但Order
只能有其中之一。
你有一個正確的hashCode和equals方法嗎? –
我沒有任何散列或等於方法。但是不應該hibernate能夠檢測到我要保存相同的'Order'並且在同一個'OrderDescription'中? – membersound
沒有正確的equals/hashcode實現。 JPA對它的工作原理相當挑剔。它將管理對象的對象替換爲不匹配的對象。如果沒有適當的equals/hashcode實現,hibernate無法檢測到這一點。因此,建議首先在其他任何事情之前堅持訂單。 –