org.hibernate.QueryException: не удалось разрешить свойство: createdDate_MOD из: org.baeldung.HibernateAuditDemo.model.Order_AUD

Я использую hibernate envers для аудита.

У меня есть простой объект Order:

@Entity
@Table(name = "orders")
@Audited
public class Order {

    @Id
    @GeneratedValue(generator = "increment")
    @GenericGenerator(name = "increment", strategy = "increment")
    private Long id;

    private Double price;

    @Temporal(TemporalType.TIMESTAMP)
    private Calendar createdDate;

    public Order() {
    }
    //the rest is unimportant

Я использую AuditorReader для запроса ревизий, в которых свойство изменилось:

    AuditReader auditReader = AuditReaderFactory.get(entityManager);
            // find revision at which order entity changed its property createdDate
            List revisions = auditReader.createQuery().forRevisionsOfEntity(Order.class, false, true).
            add(AuditEntity.property("createdDate").hasChanged()).getResultList();

            Object[] history = (Object[]) revisions.get(0);

В этом коде я получаю исключение:

org.hibernate.QueryException: could not resolve property: createdDate_MOD of: org.baeldung.HibernateAuditDemo.model.Order_AUD [select e__, r from org.baeldung.HibernateAuditDemo.model.Order_AUD e__, org.hibernate.envers.DefaultRevisionEntity r where e__.createdDate_MOD = :_p0 and e__.originalId.REV.id = r.id order by e__.originalId.REV.id asc]
        at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:83)
        at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:77)
        at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1967)

В базе данных в таблицах orders и orders_aud я вижу столбец с именем createdDate, но не createdDate_MOD.

Почему свойство createdDate не может быть разрешено?


person Volodymyr Levytskyi    schedule 08.04.2015    source источник


Ответы (2)


Чтобы сказать, что hibernate envers отслеживает изменения в определенном свойстве, вам нужно установить @Audited(withModifiedFlag = true) для этого свойства.

Чтобы установить его глобально для всех объектов, вам нужно установить org.hibernate.envers.global_with_modified_flag в true в свойствах гибернации.

person Volodymyr Levytskyi    schedule 09.04.2015

Ответ Владимира прекрасно объясняет, что нужно сделать, чтобы вызвать метод AuditEntity.property("some_property").hasChanged().

Однако у некоторых может возникнуть такое же загадочное исключение, когда не используется метод hasChanged, как и у меня.

Для этой настройки:

@Entity(name = "prnt")
@Audited
public class ParentClass {
    @Id private Long id;
}

@Entity(name = "chld")
@Audited
public class ChildClass {
    @Id private Long id;

    @ManyToOne @JoinColumn(name = "shrt_prnt_id") 
    private ParentClass looongishLinkToParentClass;
}

... можно ожидать, что это сработает:

AuditQuery q = ...;
q.add(AuditEntity.property("shrt_prnt_id")).eq(value));

..или, по крайней мере, это:

q.add(AuditEntity.property("looongishLinkToParentClass")).eq(value));

Ни то, ни другое не работает!

Это делает:

q.add(AuditEntity.property("looongishLinkToParentClass_id")).eq(value));
person Matvey Zhuravel    schedule 26.08.2019