2016-12-22 12 views
0

Я хочу отобразить карту в 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 как часть первичного ключа.

ответ

0

@MapKeyColumn используется для указания сопоставления для столбца ключа, если ключ является базовым типом, однако я не уверен, но я думаю, что DiscountType - это сама сущность, поэтому вам нужно сопоставить свой ключ с помощью @MapKeyJoinColumn.

+0

Его ключ представляет собой перечисление (из предыдущего сообщения), а аннотации XXXColumn предназначены для указания имени столбца, а не является ли что-то частью PK таблицы. –

+0

Если ключ Enum, то он должен сопоставить его с @MapKeyEnumerated , – fg78nc

+0

Я также попытался добавить '@ MapKeyEnumerated', и это не повлияло. 'MapKeyColumn' фактически отлично работает для основной таблицы соединений. это просто, когда применяется флаг '@ Audited'. У пользователей есть проблемы с таблицей аудита. – jamesw1234

Смежные вопросы