问题描述
|
使用最新的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...
我要添加第二个答案,因为这个答案与第一个答案不同。