[英]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区分)。
问题是我尝试创建具有多个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针对不同使用相同的标识符OrderItem
,因为envers只看到order_id
从@JoinColumn
,并把它作为标识符。
我不知道如何告诉envers同时使用itemId
和order_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.