2016-10-09 26 views
0

我尝试审核Order类,其中有List<OrderItem>字段。 的Order类看起来是这样的:Hibernate Envers:Audit @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区分)。

的问题是,我尝试创建Order具有多个OrderItem S,每个项目都是独一无二的,但冬眠抛出异常说:

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,因为envers只能从@JoinColumn看到order_id并将其视为标识符。

我不知道如何告诉envers同时使用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注释,并确保您实现正确的hashCode/equals方法是仅使用item_id和order_id值。

相关问题