簡體   English   中英

Hibernate Envers無法為可嵌入表“定位屬性的獲取方法”

[英]Hibernate Envers is not able to “locate getter method for property” for Embeddable table

我有一個帶有@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;
}
}

而Embedded類如下

@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類的屬性。

為了后代,我將在此處添加我在HipChat中提到的內容。

您試圖通過指定Composite-id類的特定值來使用AuditReader#find方法。 您使用的方法簽名應使用實際的可嵌入類,而不是可嵌入包含的特定屬性類型。

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 );

Whlie這避免您遇到的異常,這不會給你所期望的結果,因為嵌入謂詞將假定你有興趣Perodicity情況,其中legType屬性為null,這是不是你的目標。

然后,完成任務目標的唯一方法是使用Envers addhoc查詢功能,在其中您可以指定精確謂詞來定位感興趣的結果。

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();

希望能有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM