Hibernate禁用集合提取

时间:2011-03-28 21:24:27

标签: hibernate

使用最新的Hibernate 3 ...

有一个模型,其中Element类具有针对Relation类的2个列表集合。一个是Element拥有(来源)Relation的地方,另一个是目的地。

 <class name="Element"....>
     ....

     <list name="sourceRelations" ....>
       ...
       <one-to-many class="...Relation" />
     </list>

     <list name="destinationRelations" ....>
       ...
       <one-to-many class="...Relation" />
     </list>
 </class>

 <class name="Relation"....>
     ....
     <many-to-one name="source" class="...Element" ...
        <column name="SOURCEID" sql-type="INTEGER" not-null="true" />
     </many-to-one>
     <many-to-one name="destination" class="...Element" ...
        <column name="DESTINATIONID" sql-type="INTEGER" not-null="true" />
     </many-to-one>
 </class>

映射基本上仅在生成Criteria查询时有用。否则在获取Element时(仅通过条件,从不通过get / load)我从不希望Hibernate实际获取Relation集合。决不。现在在我的代码中我清理Element对象,然后通过创建一个新的Element并传输我希望传播的属性(即sourceRelation / destinationRelation永远不会被传输)来返回它们。对于Relation对象的条件查询也是如此。清除源/目标属性(即元素)。

有没有办法通过Hibernate拦截器代理Element实体,或者使用Tuplizers来基本上强制所有Element实体使sourceRelation / destinationRelation属性为空?

2 个答案:

答案 0 :(得分:0)

将关系集合映射为lazy =“true”不提供所需的行为吗?

如果不是这样,那么替代方法是使用类继承。为没有映射集合的Element创建一个基类,在这些情况下使用,您现在手动修改返回的数据,然后使用简单添加这些集合的子类,以便在需要大量数据时使用。

答案 1 :(得分:0)

This answer让我想起了另一种可以避免使用子类的方法。

创建一个只包含所需字段的构造函数,并在HQL中使用它,如下所示:

select new Element(e.id,...) from Element e...

我正在添加第二个答案,因为这个方法与我的第一个答案不同。

相关问题