2016-06-28 26 views
1

データベースエンティティオブジェクトOrderを作成し、BookingCodeの複数のエンティティに割り当てます。カスケード・サスペンドは重複した行を作成しますか?

問題:これはdbで1つの注文を作成しますが、これは問題ありません。ただし、オーダー自体には@OneToOneOrderDescriptionが含まれています。これはデータベースで重複して発生します。

@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つしか存在できません。

+0

適切なhashCodeとequalsメソッドがありますか? –

+0

私はハッシュまたは同等のメソッドを持っていません。しかし、私が同じ「Order」と同じ「OrderDescription」を保存しようとしていることを検出できるように休止してはいけませんか? – membersound

+1

適切なequals/hashcode実装がない場合。 JPAはそれがどのように動作するかについてはかなり厄介です。これは、オブジェクトがもはや一致しない時点でオブジェクトを管理オブジェクトに置き換えます。適切なequals/hashcode実装がなければ、Hibernateはそれを検出できません。提案はまず何かの前に順序を維持します。 –

答えて

1

最初に注文を保存してから、予約コードと予約コードの両方に割り当てます。

+0

それは、ありがとう、働く。とにかく、これらのオブジェクトを一度に保存することが可能かどうかは疑問です。 – membersound

+0

注文が同じかどうかを識別するために、注文にプライマリキーを割り当てる必要があります –

関連する問題