2012-04-09 81 views

回答

5

是的。只需註釋@Formula屬性的字段/獲取者@Basic(fetch=FetchType.LAZY)並使用hibernate提供的此ant task來爲實體類執行字節碼檢測。否則,對於@Formula屬性的懶惰加載將被忽略。

documentation包含有關如何使用此ant任務來完成字節碼檢測的信息。

+0

感謝您的回答,maven呢?有沒有辦法在maven中實現這個「字節碼檢測」的東西?因爲我使用maven而與螞蟻無關。 – destan 2012-04-09 14:19:14

+0

你可以使用'maven-antrun-plugin'插件,它可以在Maven中運行Ant任務。請參閱:http://doginpool.blogspot.com/2012/03/bytecode-instrumentation-for-hibernate.html – 2012-04-09 14:24:23

+0

maven中的字節碼檢測: http://tricksdev.blogspot.ru/2009/03/hibernate-bytecode -instrumentation.html – 2013-04-02 12:13:24

2

我在評論中看到,你希望在沒有字節碼檢測的情況下實現這一點。這可以通過實現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。但這是懶加載一對一的關係。

+0

我試過你的解決方案,但我得到了'org.hibernate.engine.spi.EntityEntry.isUquivalentNonDirty(EntityEntry.java:314)'任何想法的NPE?你使用的是哪個休眠版本? – Kakawait 2014-09-03 10:57:12

+0

@Kakawait對不起,我不確切。我後來寫了這段代碼,並相信它是3.x(其中x是未知的) – Danny 2014-09-03 12:15:01

+0

這對我有用:不要打擾使用fieldHandler作爲setter。這是一個公式沒有什麼可以在DB – jpprade 2014-12-24 10:13:19