Hibernate Envers 无法 "locate getter method for property" for Embeddable table
Hibernate Envers is not able to "locate getter method for property" for Embeddable table
我有一个带有@Audit 注释的class,如下所示
@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;
}
}
而嵌入的class如下
@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;
}
}
并通过审计 reader 我试图在特定修订中找到审计,如下所示
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 class 的 属性..
为了后代,我会在这里添加我在 HipChat 中提到的内容。
您打算做的是通过指定复合 ID class 的特定值来使用 AuditReader#find
方法。您正在使用的方法签名需要实际的 embeddable class 而不是可嵌入包含的特定属性类型。
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 谓词将假设您'对 Perodicity
个 legType
属性 为 null 的实例感兴趣,这不是您的目标。
完成任务目标的唯一方法是使用 Envers 即席查询功能,您可以在其中指定精确的谓词来定位您感兴趣的结果。
final AuditReader auditReader = AuditReaderFactory.get( session );
List results = auditReader.createQuery()
.forRevisionsOfEntity( Periodicity.class, true, false )
// add the revision number predicate
.add( AuditEntity.revisionNumber().eq( revisionId ) )
// add the instrument predicate
.add( AuditEntity.property( "id.instrumentId" ).eq( instrumentId ) )
.getResultList();
希望对您有所帮助。
我有一个带有@Audit 注释的class,如下所示
@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;
}
}
而嵌入的class如下
@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;
}
}
并通过审计 reader 我试图在特定修订中找到审计,如下所示
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 class 的 属性..
为了后代,我会在这里添加我在 HipChat 中提到的内容。
您打算做的是通过指定复合 ID class 的特定值来使用 AuditReader#find
方法。您正在使用的方法签名需要实际的 embeddable class 而不是可嵌入包含的特定属性类型。
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 谓词将假设您'对 Perodicity
个 legType
属性 为 null 的实例感兴趣,这不是您的目标。
完成任务目标的唯一方法是使用 Envers 即席查询功能,您可以在其中指定精确的谓词来定位您感兴趣的结果。
final AuditReader auditReader = AuditReaderFactory.get( session );
List results = auditReader.createQuery()
.forRevisionsOfEntity( Periodicity.class, true, false )
// add the revision number predicate
.add( AuditEntity.revisionNumber().eq( revisionId ) )
// add the instrument predicate
.add( AuditEntity.property( "id.instrumentId" ).eq( instrumentId ) )
.getResultList();
希望对您有所帮助。