データベースエンティティオブジェクトOrder
を作成し、BookingCode
の複数のエンティティに割り当てます。カスケード・サスペンドは重複した行を作成しますか?
問題:これはdbで1つの注文を作成しますが、これは問題ありません。ただし、オーダー自体には@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
結果:私のデータベースで 私は同じOrder
オブジェクトを再利用して別のにそれを割り当てられているので、私はその後、私は一つだけを期待 OrderDescription
エントリを持っていますBookingCode
オブジェクトです。
同様:Order
として
table order_descrption:
1;"de";"testdescr";"123456"
2;"de";"testdescr";"123456"
はOrderDescription
に@OneToOne
関係を持っており、select
が正しくfindOne()
作品を使用して、なぜ私も理解していません。データベースでは、私は今、同じOrder
にマップする2つのOrderDescriptions
を持っていますが、Order
にはそれらのうちの1つしか存在できません。
適切なhashCodeとequalsメソッドがありますか? –
私はハッシュまたは同等のメソッドを持っていません。しかし、私が同じ「Order」と同じ「OrderDescription」を保存しようとしていることを検出できるように休止してはいけませんか? – membersound
適切なequals/hashcode実装がない場合。 JPAはそれがどのように動作するかについてはかなり厄介です。これは、オブジェクトがもはや一致しない時点でオブジェクトを管理オブジェクトに置き換えます。適切なequals/hashcode実装がなければ、Hibernateはそれを検出できません。提案はまず何かの前に順序を維持します。 –