2

我有使用存储功能的实体。这很好,但在某些情况下我不需要此字段(fieldStoreFunc1、fieldStoreFunc2 ..)并且仅在必要时使用 B 类和 fieldStoreFuncs:

@Entity
@Table(name = "table")
@SequenceGenerator(name = "JDE_SEQUENCE", sequenceName = "JDE_SEQUENCE", allocationSize = 1)
public class EntityClass implements Trackable {

    @Id
    @GeneratedValue(generator = "JDE_SEQUENCE", strategy = GenerationType.SEQUENCE)
    private Long id;

    @Column(name = "name_field")
    private String field1;


    @Column(name = "name_field")
    private String field2;

    @Column(name = "name_field")
    private String field3;
    ......

    //read only fields
    @Formula("store_func(value)")
    private String fieldStoreFunc1;

    @Formula("store_func(value)")
    private String fieldStoreFunc2;

    @Formula("store_func(value)")
    private String fieldStoreFunc3;
}

所以我可以把班级分成

class A{
    @Column(name = "name_field")
        private String field1;


        @Column(name = "name_field")
        private String field2;

        .....
}

class B extends A{
        //read only fields
        @Formula("store_func(value)")
        private String fieldStoreFunc1;

        @Formula("store_func(value)")
        private String fieldStoreFunc2;

        @Formula("store_func(value)")
        private String fieldStoreFunc3;
}
4

2 回答 2

2

不,这不是你应该做的。

首先,测量、分析和证明加载这三个额外的字段会导致显着的开销和性能问题。

一次,并且只有一次你有这个证明,然后考虑延迟加载额外的三个字段,如文档中所述。然后再次测量,证明这三个字段的延迟加载不会造成更大的开销和性能问题。

如文档中所述:

Hibernate3 支持对单个属性的惰性获取。这种优化技术也称为提取组。请注意,这主要是一种营销功能;优化行读取比优化列读取重要得多。但是,仅加载类的某些属性在极端情况下可能很有用。例如,当遗留表有数百列并且无法改进数据模型时。

除非 store_func 公式非常昂贵,否则您可能应该避免尝试优化任何东西。

于 2012-09-22T13:32:18.300 回答
0

尽管我同意JB Nizet您是否仍愿意按需加载这些属性。只是为了记录。

您可以通过几种方式实现。更简单的方法是在您的类中创建一个构造函数,该构造函数具有您始终想要加载的属性

Please Note that is just an example and is not properly developed

public class A {
  ...
  @Column(name = "name_field")
  private String field1;

  @Formula("store_func(value)")
  private String fieldStoreFunc1;

  ...
  public A(String id, String field1) {
     this id = id; 
     this.field1 = field1;
  }

然后在DAO创建一个加载实体的函数

public class DAO {
    getLight(Long id) {
       String named_query = "select a.id, a.field1 from A a where a.id = :id"
       // Execute query
    }

另一种方法是查看Hibernate event或编写自定义实体加载器。

于 2012-09-22T13:45:34.410 回答