我已經使用@Formula
註釋來使用它來獲取計算屬性。我需要的是那些註釋爲@Formula
註釋的字段/ getter應該被延遲加載。是否有可能使@Formula註釋延遲加載?
這是甚至可能的,如果是的話如何?
謝謝
我已經使用@Formula
註釋來使用它來獲取計算屬性。我需要的是那些註釋爲@Formula
註釋的字段/ getter應該被延遲加載。是否有可能使@Formula註釋延遲加載?
這是甚至可能的,如果是的話如何?
謝謝
是的。只需註釋@Formula
屬性的字段/獲取者@Basic(fetch=FetchType.LAZY)並使用hibernate提供的此ant task來爲實體類執行字節碼檢測。否則,對於@Formula
屬性的懶惰加載將被忽略。
documentation包含有關如何使用此ant任務來完成字節碼檢測的信息。
我在評論中看到,你希望在沒有字節碼檢測的情況下實現這一點。這可以通過實現FieldHandled
接口以及修改懶惰字段的getter和setter來實現。
HBM
<property name="deletable" type="true_false" lazy="true">
<formula>(select something from other tables and such....)</formula>
</property>
JAVA
import org.hibernate.bytecode.javassist.FieldHandled;
import org.hibernate.bytecode.javassist.FieldHandler;
public class Person implements FieldHandled {
/* allows lazy formulas without hibernate bytecode instrumentation */
private FieldHandler fieldHandler;
public FieldHandler getFieldHandler() { return fieldHandler; }
public void setFieldHandler(FieldHandler fieldHandler) { this.fieldHandler = fieldHandler; }
private Boolean deletable;
public void setDeletable(Boolean deletable) {
if(fieldHandler!=null)
fieldHandler.writeObject(this, "deletable", this.deletable, deletable);
this.deletable = deletable;
}
public Boolean getDeletable() {
if(fieldHandler!=null)
return (Boolean)fieldHandler.readObject(this, "deletable", deletable);
return deletable;
}
}
又如可以發現here。但這是懶加載一對一的關係。
我試過你的解決方案,但我得到了'org.hibernate.engine.spi.EntityEntry.isUquivalentNonDirty(EntityEntry.java:314)'任何想法的NPE?你使用的是哪個休眠版本? – Kakawait 2014-09-03 10:57:12
@Kakawait對不起,我不確切。我後來寫了這段代碼,並相信它是3.x(其中x是未知的) – Danny 2014-09-03 12:15:01
這對我有用:不要打擾使用fieldHandler作爲setter。這是一個公式沒有什麼可以在DB – jpprade 2014-12-24 10:13:19
感謝您的回答,maven呢?有沒有辦法在maven中實現這個「字節碼檢測」的東西?因爲我使用maven而與螞蟻無關。 – destan 2012-04-09 14:19:14
你可以使用'maven-antrun-plugin'插件,它可以在Maven中運行Ant任務。請參閱:http://doginpool.blogspot.com/2012/03/bytecode-instrumentation-for-hibernate.html – 2012-04-09 14:24:23
maven中的字節碼檢測: http://tricksdev.blogspot.ru/2009/03/hibernate-bytecode -instrumentation.html – 2013-04-02 12:13:24