级联持久创建重复行吗? [英] Cascade persist creates duplicate rows?

查看:67
本文介绍了级联持久创建重复行吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在创建一个数据库实体对象 Order ,并将其分配给 BookingCode 类型的多个实体。 / p>

问题:这会在db中创建一个单,这很好。但是订单本身具有 @OneToOne OrderDescription ,在数据库中重复出现。

  @Entity 
公共类BookingCode {
@Id
私有Long id;

@ManyToOne(级联= {CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH,CascadeType.DETACH})
私人订单;
}

@Entity
public class Order {
@Id
private Long id;

私有字符串orderName;

@OneToOne(mappedBy = order,级联= CascadeType.ALL,orphanRemoval = true)
私人OrderDescription描述;
}

@Entity
公共类OrderDescription {
@Id
私有Long id;

//为简单起见,仅一个文本元素;当然,现实生活中有多个字段
私有字符串文本;

@OneToOne
私人订单;
}

测试:

 订单order = new Order(); 
order.setOrderName( test);

OrderDescription d =新的OrderDescription( testdescr);
d.setOrder(order);
order.setDescription(d);

List< BookingCodes>代码=新的ArrayList<>();

BookingCode代码= new BookingCode();
code.setOrder(order);
codes.add(order);

BookingCode code2 = new BookingCode();
code2.setOrder(order); //使用相同的报价实体!
codes.add(order2);

代码= dao.save(代码); // Spring的CrudRepository

dao.findOne(codes.get(0).getId()); //这有效,找到一个包含以下订单描述之一的订单

结果:
在我的数据库中然后有两个 OrderDescription 条目,我只希望其中一个,因为我重用了相同的 Order 对象,并将其分配给其他 BookingCode 对象。



喜欢:

 表order_descrption:
1; de; testdescr; 123456
2; de; testdescr ; 123456

由于 Order 有与 OrderDescription
@OneToOne 关系我什至不明白为什么 findOne()>选择可以正常工作。因为在数据库中我现在有两个 OrderDescriptions 映射到相同的 Order ,但有一个 Order 只能有一个。

解决方案

先保留订单,然后将其分配给两个bookingCode 。


I'm creating a database entity object Order, and assign it to multiple entities of type BookingCode.

Problem: this creates a single order in db, which is fine. But the order itself has a @OneToOne OrderDescription, which occurs duplicate in the database.

@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;
}

Test:

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

Result: In my database I then have two OrderDescription entries, where I would expect only one, because I reused the same Order object and assigned it to different BookingCode objects.

Like:

table order_descrption:
1;"de";"testdescr";"123456"
2;"de";"testdescr";"123456"

As Order has a @OneToOne relation to OrderDescription And I even don't understand why the select using findOne() works correctly. Because in database I now have two OrderDescriptions that map to the same Order, but an Order can only have one of them.

解决方案

Persist the order first and then assign it to both bookingCode .

这篇关于级联持久创建重复行吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆