我创建了一个数据库实体对象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 :(得分:2)
先保留订单,然后将其分配给bookingCode。
答案 1 :(得分:0)
我有一个类似的问题,我有一个Order obj,它的变量prevOrder引用了自己,即Order实体。当我存储订单时,最终将存储prevOrder的重复记录。
我有以下代码:
@Entity
@Table(name = "orders")
public class Order implements Serializable {
@Id
@GeneratedValue(generator = "order_id_generator")
@SequenceGenerator(name = "order_id_generator", sequenceName = "order_id_sequence", allocationSize = 1)
@Column(name = "id", updatable = false, nullable = false)
private Long id;
@OneToOne(cascade = CascadeType.ALL, optional = true)
@JoinColumn(name = "previous_order_id", unique = true, updatable = false, referencedColumnName = "id")
private Order previousOrder;
@OneToOne(cascade = CascadeType.ALL, mappedBy = "previousOrder")
private Order nextOrder;
...
我尝试了各种方法,包括覆盖equals和Order的哈希码,以及添加一个OneToOne mappingBy字段“ nextOrder”等。但是注意到JPA甚至没有调用equals()来确定对象的唯一性。最终,我发现JPA使用 id字段作为对象的标识符,并且在将对象存储到分布式缓存时,我没有存储生成的ID。因此,在持久性过程中始终需要创建新对象。