休眠禁用收集获取

问题描述

| 使用最新的Hibernate 3 ... 有一个模型,其中Element类有2个针对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>
映射本质上仅在生成条件查询时有用。否则,当获取一个Element时(仅通过一个条件,从不通过get / load),我从不希望Hibernate实际获取Relation集合。决不。现在,在我的代码中,我先清理Element对象,然后再通过创建一个新Element并转移要传播的属性来返回它们(即sourceRelation / destinationRelation永远不会转移)。针对关系对象的条件查询也是如此。清除了源/目标属性(即Element)。 有没有一种方法可以通过Hibernate拦截器或使用Tuplizers代理Element实体来基本上强制所有Element实体使sourceRelation / destinationRelation属性无效?     

解决方法

是否将关系集合映射为lazy = \“ true \”不能提供所需的行为? 如果不是这种情况,那么替代方法是使用类继承。对于没有映射集合的Element,有一个基类,可以在这种情况下使用,现在您要手动修改返回的数据,然后再创建一个简单地添加这些集合的子类,以在需要大量数据时使用。     ,这个答案使我想起了另一种可以避免使用子类的方法。 创建仅包含所需字段的构造函数,并在HQL中使用它,如下所示:
select new Element(e.id,...) from Element e...
我要添加第二个答案,因为这个答案与第一个答案不同。