我已使用@Formula
注释将其用于获取计算属性。我需要的是那些用@Formula
注释注释的字段/ getter应该被延迟加载。
这是否可能,如果是这样的话?
感谢
答案 0 :(得分:6)
是的。只需通过@Basic(fetch=FetchType.LAZY)注释@Formula
属性的字段/ getter,并使用hibernate提供的ant task来为实体类执行字节码检测。否则,将忽略@Formula
属性的LAZY加载。
documentation包含有关如何使用此ant任务执行字节码检测的信息。
答案 1 :(得分:3)
我在评论中看到,您希望在没有字节码检测的情况下实现此目的。这可以通过实现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。但这是懒惰加载一对一的关系。
答案 2 :(得分:0)
我尝试了BytecodeEnhancement (Maven Plugin),但没有用。 所以我做了这个:
创建一个类(FooFormula.java),将其映射到表 两个字段,一个用于@id,另一个用于@Formula。
CloudFrontFullAccess
使用@ManyToOne和@JoinColumn将这个新类(FooFormula.java)作为字段添加到您的实体
@Entity
@Table(name = "BAR_TABLE")
public class FooFormula implements Serializable {
private Long idBarTable;
private Long formula;
public FooFormula() {
super();
}
public FooFormula(String idBarTable) {
super();
this.idBarTable = idBarTable;
}
@Id
@Column(name = "ID_BAR_TABLE", unique = true, nullable = false, length = 20)
public Long getIdBarTable() {
return this.sitidBarTableCodigo;
}
public void setIdBarTable(Long idBarTable) {
this.idBarTable = idBarTable;
}
@Formula("(SELECT 1 from DUAL)")
public Long getFormula() {
return formula;
}
public void setFormula(Long formula) {
this.formula = formula;
}
}