Hibernate Envers无法为Embeddable表“定位属性的getter方法”

时间:2017-04-10 12:15:05

标签: java hibernate hibernate-envers

我有一个@Audit注释类,如下所示

@Entity
@Audited(withModifiedFlag=true)
@Table(name = "PERIODICITY")
public class Periodicity implements java.io.Serializable {

private PeriodicityId id;
private String frequency;

@EmbeddedId
@AttributeOverrides({
        @AttributeOverride(name = "instrumentId", column = @Column(name = "INSTRUMENT_ID", nullable = false, precision = 22, scale = 0)),
        @AttributeOverride(name = "legType", column = @Column(name = "LEG_TYPE", nullable = false, precision = 38, scale = 0))})
public PeriodicityId getId() {
    return this.id;
}
public void setId(PeriodicityId id) {
    this.id = id;
}
@Column(name = "FREQUENCY", nullable = false, length = 20)
public String getFrequency() {
    return this.frequency;
}
}

嵌入式课程如下

@Embeddable
public class PeriodicityId implements java.io.Serializable {

private Long instrumentId;
private Long legType;
@Column(name = "INSTRUMENT_ID", nullable = false, precision = 22, scale = 0)
public Long getInstrumentId() {
    return this.instrumentId;
}

public void setInstrumentId(Long instrumentId) {
    this.instrumentId = instrumentId;
}

@Column(name = "LEG_TYPE", nullable = false, precision = 38, scale = 0)
public Long getLegType() {
    return this.legType;
}
}

通过审计读者,我试图在特定修订中找到审计如下

Session session = HibernateUtil.currentSession();
AuditReader reader = AuditReaderFactory.get(session);

Periodicity periodicity = reader.find( Periodicity.class, instrumentId, revision_Id);

但是它给出了像

这样的例外
org.hibernate.PropertyNotFoundException: Could not locate getter method for property [java.lang.Long#instrumentId]
at org.hibernate.internal.util.ReflectHelper.findGetterMethod(ReflectHelper.java:408)
at org.hibernate.property.access.internal.PropertyAccessBasicImpl.<init>(PropertyAccessBasicImpl.java:41)
at org.hibernate.property.access.internal.PropertyAccessStrategyBasicImpl.buildPropertyAccess(PropertyAccessStrategyBasicImpl.java:27)
at org.hibernate.envers.internal.tools.ReflectionTools.getGetter(ReflectionTools.java:53)

请帮助如何访问Embeddable类的属性..

1 个答案:

答案 0 :(得分:0)

为了后人的缘故,我在这里添加我在HipChat中提到的内容。

您要尝试做的是通过指定composite-id类的特定值来使用AuditReader#find方法。您正在使用的方法签名需要实际的 embeddable 类,而不是embeddable包含的特定属性类型。

AuditReader#find的正确用法如下:

// define your embeddable class attributes
final PeriodicityId id = new PeriodicityId();
id.setInstrumentId( instrumentId );

// lookup revision 1
final Number revisionId = 1; 

// query
final AuditReader auditReader = AuditReaderFactory.get( session );
auditReader.find( Periodicity.class, id, revisionId );

这可以避免您遇到的异常,但赢了会为您提供预期的结果,因为 embeddable 谓词会假设您对{感兴趣{ {1}} Perodicity属性为空的实例,这不是您的目标。

您可以实现任务目标的唯一方法是使用Envers adhoc查询功能,您可以在其中指定精确谓词以定位您感兴趣的结果。

legType

希望有所帮助。