我有一個@Embeddable
類,它使用屬性訪問來包裝另一個對象,該對象不能由JPA通過字段訪問直接映射。它看起來像這樣:JPA EclipseLink Weaver在其setter中生成對porperty getter的調用 - > NullPointerException
@Embeddable
@Access(AccessType.PROPERTY)
public class MyWrapper {
@NotNull
@Transient
private WrappedType wrappedField;
protected MyWrapper() {
}
public MyWrapper(WrappedType wrappedField) {
this.wrappedField = wrappedField;
}
@Transient
public WrappedType getWrappedField() {
return wrappedField;
}
public void setWrappedField(WrappedType wrappedField) {
this.wrappedField = wrappedField;
}
@Column(name = "wrappedTypeColumn")
protected String getJPARepresentation() {
return wrappedField.toString();
}
protected void setJPARepresentation(String jpaRepresentation) {
wrappedField = new WrappedType(jpaRepresentation);
}
}
堅持用MyWrapper
領域的@Entity
工作正常。但是當我執行查詢從數據庫加載實體時,我得到一個NullPointerException
。堆棧跟蹤和一些調試顯示Eclipselink通過調用其默認構造函數創建一個新的MyWrapper
實例,然後調用setJPARepresentation()
方法(如預期的那樣)。
但是現在意外發生了:堆棧跟蹤顯示是從setter中調用的,當然返回wrappedField.toString()
執行時會導致NullPointerException
。
java.lang.NullPointerException
at MyWrapper.getJPARepresentation(MyWrapper.java:27)
at MyWrapper.setJPARepresentation(MyWrapper.java)
... 109 more
事實是,有明顯的代碼到吸氣劑沒有呼叫和棧跟蹤示出了從其中的setter稱爲吸氣指示沒有行號。所以我的結論是,Eclipselink的字節碼編織器產生了對getter的調用。
建立一個解決方法很容易,但我的問題是:爲什麼Eclipselink會這樣做?
PS:我使用的EclipseLink 2.3.2.v20111125-r10461在GlassFish應用服務器版本3.1.2(建立23)
無法使用字段訪問,因爲JPA沒有本地支持來映射'MyWrapper',我不能使用轉換器我不允許使用提供程序依賴的機制,因爲代碼必須與OpenJPA一起運行。 – 2013-04-18 14:16:51