我尝试审计具有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,每一项都是唯一的,但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只看到来自@JoinColumn的order_id,并将其视为标识符。
我不知道如何告诉envers同时使用itemId和order_id作为修订的标识符,或者可能我误解了这个问题。
请帮帮忙。
谢谢。
发布于 2016-10-10 19:29:19
相反,您可能希望考虑按如下方式进行映射:
@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方法。
https://stackoverflow.com/questions/39941603
复制相似问题