Hibernate Envers:审核@CollectionTable字段

时间:2016-10-09 08:35:38

标签: java hibernate hibernate-envers

我尝试审核具有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区分)。

问题是我尝试创建具有多个Order s的OrderItem,每个项都是唯一的,但是hibernate抛出异常说:

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作为修订标识符,或者我误解了这个问题。

请帮忙。

谢谢。

1 个答案:

答案 0 :(得分: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注释,并确保实现正确使用item_id和order_id值的hashCode / equals方法。