2016-10-09 14 views
0

List<OrderItem>フィールドを持つOrderクラスを監査しようとしています。 Orderクラスは次のようになります。Hibernate Envers:@CollectionTableフィールドの監査

class Order { 
    @Audited 
    @ElementCollection(fetch = FetchType.EAGER) 
    @CollectionTable(name = "order_order_item", joinColumns = @JoinColumn(name = "order_id")) 
    List<OrderItem> items; 
} 

そしてOrderItemのクラスは次のようになります。

class OrderItem { 
    private Integer quantity; 
    private Long itemId; 
} 

各注文する必要がありますが、独特のOrderItemを(のitemIdにより区別)が含まれています。問題は、私は複数のOrderItem Sを有しているOrderを作成しようということである

、各アイテムはユニークですが、スロー例外を休止言った:

A different object with the same identifier value was already associated with the session : [order_order_item_AUD#{SETORDINAL=1, REV=DefaultRevisionEntity(id = 16, revisionDate = Oct 9, 2016 1:38:12 PM), Order_id=57, REVTYPE=ADD}]; nested exception is javax.persistence.EntityExistsException: A different object with the same identifier value was already associated with the session : [order_order_item_AUD#{SETORDINAL=1, REV=DefaultRevisionEntity(id = 16, revisionDate = Oct 9, 2016 1:38:12 PM), Order_id=57, REVTYPE=ADD}] 

私はその問題はおそらくenversが異なるため、同じ識別子を使用してということだと思いますOrderItemは、order_id@JoinColumnからのみ参照し、それを識別子として扱うためです。

エンバーに改訂の識別子としてitemIdorder_idの両方を使用するように指示する方法がわかりません。あるいは、私はこの誤解を誤解するかもしれません。

助けてください。

ありがとうございます。

+0

あなたのケースではプライマリキーはitemIdとorder_idの複合ですか? –

+0

私が与えたクラス定義から、 'OrderItem'定義内にorder_idがないので、itemIdとorder_idの複合であるように主キーが明示的に設定されていませんが、RDBMSで一意の制約を作成することがあります。 – Stackle

+0

私は「@ ElementCollection」も主キーを気にしないと思うので、@ JoinColumnをジョインポイントとして使用して '@ CollectionTable'から項目をフェッチ/ジョインするだけです。 – Stackle

答えて

1

代わりにあなたは次のようにこれをマッピングする検討する必要があります。

@Embeddable 
public class OrderItemId implements Serializable { 
    private Long orderId; 

    private Long itemId; 
} 

@Entity 
public class OrderItem { 
    @EmbeddedId 
    private OrderItemId id; 

    @ManyToOne 
    @MapsId("orderId") 
    @JoinColumn(name = "order_id") 
    private Order order; 

    @ManyToOne 
    @MapsId("itemId") 
    @JoinColumn(name = "item_id") 
    private Item item; 
} 

あなたが@ElementCollectionマッピングを維持したい場合は、あなたが@OrderColumn注釈を含める必要があり、あなたが適切なのhashCodeを実装することを確認して/そのメソッドに等しいですitem_idおよびorder_id値のみを使用します。

関連する問題