【发布时间】:2017-05-07 13:29:57
【问题描述】:
我想在 JPA Hibernate 中映射一个 Map。设置看起来像
@Entity(name = "reservation")
@Table(name = "reservation")
@Access(AccessType.FIELD)
@Audited
public class ReservationEntity {
// other fields
@ElementCollection(fetch = FetchType.EAGER)
@MapKeyColumn(name = "discountType")
@Column(name = "discountAmount")
@CollectionTable(
name="discountTypeAndAmount",
joinColumns=@JoinColumn(name="reservation_id")
)
private Map<DiscountType, BigDecimal> discountTypeAndAmount;
}
我可以第一次将实体写入数据库,但是当我更新实体时,entitymanager.getTransaction().commit() 出现以下错误:
Caused by: javax.persistence.EntityExistsException: A different object with
the same identifier value was already associated with the session :
[discountTypeAndAmount_AUD#{REV=DefaultRevisionEntity(id = 3,
revisionDate = Dec 20, 2016 8:52:45 PM), element=10.00,
ReservationEntity_reservation_id=1, mapkey=CASE_STUDY}]
在例外情况下,CASE_STUDY 是枚举之一。 discountTypeAndAmount_AUD 是自动生成的审计日志表。
审计表 discountTypeAndAmount 似乎是使用由 REV(修订 ID)、reservation_id、discountType 和 discountAmount 组成的复合键生成的,并且由于 envers 没有引发错误不知道如何处理 BigDecimal 作为主键的一部分。
是否有注释将审计表的主键设置为仅由 REV(修订 ID)、reservation_id 和 discountType 组成的组合?由于该字段无论如何都是一个映射,因此确实不需要将discountAmount 作为主键的一部分。
【问题讨论】: