16

我使用@Formula注释来获取计算属性。我需要的是那些用@Formula注释注释的字段/吸气剂应该被延迟加载。

这甚至可能吗?如果可以,怎么办?

谢谢

4

3 回答 3

9

是的 。只需通过@Basic(fetch=FetchType.LAZY)@Formula注释属性的字段/获取器,并使用hibernate 提供的这个ant 任务来为实体类执行字节码检测。否则,属性的 LAZY 加载将被静默忽略。@Formula

文档包含有关如何使用此 ant 任务进行字节码检测的信息。

于 2012-04-09T10:38:49.133 回答
4

我在评论中看到您希望在没有字节码检测的情况下实现这一目标。这可以通过实现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;
}
}

另一个例子可以在这里找到。但这是延迟加载一对一的关系。

于 2013-09-12T13:56:04.317 回答
1

我尝试使用BytecodeEnhancement(Maven 插件)但不起作用。所以我做了这个:

  1. 创建一个类(FooFormula.java),将其映射到具有两个字段的表,一个用于@id,另一个用于@Formula。

     @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;
      }
    }
    
  2. 使用 @ManyToOne 和 @JoinColumn 将此新类 (FooFormula.java) 作为字段添加到您的实体

     @Entity
     @Table(name = "BAR_TABLE")
     public class Bar implements Serializable {
    
      private Long idBarTable;
      private Long somOtherColumn;
      private FooFormula fooFormula;
    
      public Bar() {
        super();
      }
    
      public Bar(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;
      }
    
      @ManyToOne(fetch = FetchType.LAZY)
      @JoinColumn(name = "ID_BAR_TABLE", nullable = false, insertable=false, updatable=false)
      public FooFormula getFooFormula() {
        return fooFormula;
      }
    
      public void setFooFormula(FooFormula fooFormula) {
        this.fooFormula = fooFormula;
      }
    }
    
于 2019-04-08T21:15:41.630 回答