Java org.hibernate.QueryException:无法解析属性:createdDate\u MOD of:org.baeldung.HibernateAuditDemo.model.Order\u AUD
我使用hibernate envers进行审计 我有简单的Java org.hibernate.QueryException:无法解析属性:createdDate\u MOD of:org.baeldung.HibernateAuditDemo.model.Order\u AUD,java,hibernate-envers,Java,Hibernate Envers,我使用hibernate envers进行审计 我有简单的订单实体: @Entity @Table(name = "orders") @Audited public class Order { @Id @GeneratedValue(generator = "increment") @GenericGenerator(name = "increment", strategy = "increment") private Long id; private
订单
实体:
@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\u aud
中的数据库中,我看到了名为createdDate
的列,但没有createdDate\u MOD
为什么不能解析属性
createdDate
?要告诉hibernate envers跟踪对特定属性的更改,您需要在该属性上设置@Audited(withModifiedFlag=true)
要为所有实体全局设置它,您需要在hibernate属性中将带有修改标志的
org.hibernate.envers.global\u设置为true。Volodymir的答案完美地解释了调用AuditEntity.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));