我想在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
和{{1}组成的复合密钥生成的因为envers不知道如何处理discountAmount
作为主键的一部分而引发错误。
是否有注释将审核表的主键设置为仅BigDecimal
(修订版ID),REV
和reservation_id
的组合?由于该字段无论如何都是地图,因此实际上不需要将discountType
作为主键的一部分。
答案 0 :(得分:0)
@MapKeyColumn用于指定键列的映射,如果键是基本类型,但我不确定,但我想DiscountType本身就是实体,所以你需要使用@MapKeyJoinColumn来映射你的键。