我正在创建数据库实体对象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无法检测到这一点。因此,建议首先在其他任何事情之前坚持订单。 –