级联持久创建重复行吗? [英] Cascade persist creates duplicate rows?
问题描述
我正在创建一个数据库实体对象 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屋!