Я хочу отобразить карту в JPA Hibernate. Настроить внешний вид, какjava hibernate envers set другой первичный ключ для таблицы аудита
@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",
[email protected](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
(идентификатор версии), reservation_id
, discountType
и discountAmount
и ошибка возникает из-за Envers не знает, как обращаться с BigDecimal
как часть первичный ключ.
Есть ли аннотация для установки первичного ключа для таблицы аудита как составной только REV
(идентификатор ревизии), reservation_id
и discountType
? Поскольку в любом случае поле является картой, нет необходимости иметь discountAmount
как часть первичного ключа.
Его ключ представляет собой перечисление (из предыдущего сообщения), а аннотации XXXColumn предназначены для указания имени столбца, а не является ли что-то частью PK таблицы. –
Если ключ Enum, то он должен сопоставить его с @MapKeyEnumerated , – fg78nc
Я также попытался добавить '@ MapKeyEnumerated', и это не повлияло. 'MapKeyColumn' фактически отлично работает для основной таблицы соединений. это просто, когда применяется флаг '@ Audited'. У пользователей есть проблемы с таблицей аудита. – jamesw1234