gpt4 book ai didi

java - hibernate 恩弗斯 : Audit @CollectionTable field

转载 作者:行者123 更新时间:2023-12-01 09:24:36 27 4
gpt4 key购买 nike

我尝试审核Order类有 List<OrderItem> field 。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其中有多个OrderItem s,每一项都是唯一的,但是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 使用相同的标识符因为恩弗斯只看到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 的正确 hashCode/equals 方法仅限 order_id 值。

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com