我已经使用@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