级联持久创建重复行?

时间:2016-06-28 10:28:37

标签: java spring postgresql

我创建了一个数据库实体对象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只能有一个{。}}。

2 个答案:

答案 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。因此,在持久性过程中始终需要创建新对象。

相关问题