2016-10-09 2 views
0

List<OrderItem> 필드를 가진 Order 클래스를 감사하려고합니다. Order 클래스는 다음과 같습니다최대 절전 모드 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들이 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 다른에 대해 동일한 식별자를 사용하는 것이 될 생각 OrderItemorder_id@JoinColumn에서 확인하고 식별자로 취급하므로

변경자의 식별자로 itemIdorder_id을 모두 사용하는 방법을 알지 못하거나 문제를 오해 할 수도 있습니다.

도와주세요.

감사합니다. 다음과 같이

대신
+0

그래서 기본 항목 키는 itemId와 order_id를 합성합니까? –

+0

내가 준 클래스 정의에서 itemId와 order_id의 합성이되도록 명시 적으로 기본 키를 설정하지는 않습니다. 왜냐하면'OrderItem' 정의 내에 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 주석을 포함해야 할 수 있습니다 당신이 적절한 해시 코드/equals 메소드를 구현하는 item_id 및 order_id 값만 사용하십시오.