我尝试审核具有Order字段的List<OrderItem>类。
Order类如下所示:

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区分)。

问题是我尝试创建具有多个OrderOrderItem,每个项目都是唯一的,但是休眠抛出异常表示:

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仅从order_id看到@JoinColumn并将其视为标识符。

我不知道如何告诉envers同时使用itemIdorder_id作为修订的标识符,或者我可能误解了这个问题。

请帮忙。

谢谢。

最佳答案

相反,您可能需要考虑如下映射:

@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批注,并确保实现仅使用item_id和order_id值的正确hashCode / equals方法。

关于java - hibernate Envers:Audit @CollectionTable字段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39941603/

10-13 02:30