【发布时间】:2015-05-14 11:39:15
【问题描述】:
在我们的项目中,我们有一个实体“餐厅”,其中包含近 30 个字段(有些与其他实体有关系)。因此,每次我们需要一个“Restaurant”对象时,即使是几个字段,也会检索所有其他字段。这会影响性能。所以,在HBM文件中,我们写了两个类,都指向同一个物理类和同一个数据库表,如下所示。
=== restaurant.hbm.xml ===
<!-- Light Weight Version -->
<class name="com.raj.model.Restaurant" table="RESTAURANTS" entity-name="RestaurantLite"
dynamic-update="false" dynamic-insert="false">
<cache usage="read-only"/>
<!-- few basic properties and relationships -->
</class>
<!-- Restaurant -->
<class name="com.raj.model.Restaurant" table="RESTAURANTS" entity-name="Restaurant">
<!-- all properties and relationships -->
</class>
在其中一个 DAO 实现中,我们使用的 Criteria 采用“RestaurantLite”并返回如下所示的餐厅列表。
Criteria criteria = session.createCriteria("RestaurantLite");
// criteria related stuff
return new LinkedHashSet<Restaurant>(criteria.list());
现在我们要删除所有 hbm 文件并使用注释。那么如何使用实体的注释来完成相同的操作呢?我们是否需要创建一个额外的类“RestaurantLite”?如果是这样,上述条件如何返回 'Restaurant' 对象??
【问题讨论】:
-
这会影响性能。到什么程度?你量过吗?正如 Hibernate 文档所指出的:优化行读取比优化列读取重要得多。但是,仅加载类的某些属性在极端 情况下可能有用。例如,当旧表具有 数百 列并且无法改进数据模型时。 docs.jboss.org/hibernate/orm/3.3/reference/en/html/…
-
@Alan Hay 我们有一个数据库,每个表都有数千条记录。大多数操作都需要上面提到的类。因此,每次检索每家餐厅的所有属性肯定会影响性能。因此,我们在 hbm 文件中提出了该解决方案。
-
所有数据库都有数千、几万、几百万行。正如 Hibernate 文档指出的那样,列优化很少值得。 en.wikipedia.org/wiki/Program_optimization#When_to_optimize
-
@AlanHay 是的。但是我们不能更改遗留代码。我们必须使用注释并删除 hbm 文件..
标签: java database spring hibernate jpa