繁体   English   中英

休眠Envers:Audit @CollectionTable字段

[英]Hibernate Envers: Audit @CollectionTable field

我尝试审核具有List<OrderItem>字段的Order类。 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区分)。

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

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方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM