2012-04-09 40 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