使用最新的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属性为空?
答案 0 :(得分:0)
将关系集合映射为lazy =“true”不提供所需的行为吗?
如果不是这样,那么替代方法是使用类继承。为没有映射集合的Element创建一个基类,在这些情况下使用,您现在手动修改返回的数据,然后使用简单添加这些集合的子类,以便在需要大量数据时使用。
答案 1 :(得分:0)
This answer让我想起了另一种可以避免使用子类的方法。
创建一个只包含所需字段的构造函数,并在HQL中使用它,如下所示:
select new Element(e.id,...) from Element e...
我正在添加第二个答案,因为这个方法与我的第一个答案不同。