2011-03-28 56 views
2

使用最新的休眠3 ...休眠禁用集合提取

有一个模型,其中Element类有一个关系类的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> 

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

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

回答

0

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

如果情况并非如此,那么另一种方法是使用类继承。拥有一个没有映射集合的Element的基类,以便在这些情况下使用您现在手动修改返回的数据,然后使用一个仅添加这些集合的子类,以便在需要大量数据时使用。

+0

整个想法不必子。元素/关系类应该是通用的。 – 2011-05-30 08:46:53

+0

为什么懒惰=“真”不够? – 2011-06-01 15:55:14

0

This answer提醒我其他的方法,可以让你避免使用子类。

创建包含只是你想要的字段的构造,并用它在你的HQL是这样的:

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

我加入了第二个答案,因为这是一个比我的第一个答案不同的方法。

+0

很酷的建议。使用标准进行查询并获得好的结果。但是如果你可以在HQL中完成,那么它应该可以与其他API一起使用。 将玩耍并找回你。曾经尝试过你的玩伴吗?基本上你的建议是我在我的代码中所做的。创建一个新的元素并填充我想要的。这只是它看起来像一个额外的步骤和浪费的对象。 – 2011-06-02 19:57:07

+0

我大量使用HQL/JPQL,因为我喜欢在开始时利用Hibernate对Named Queries的检查作为我的开发过程中的快速失败策略。我还没有亲自尝试过其他方法。 – 2011-06-02 21:04:12