我正在使用Hibernate 3.6.9作为ORM和xml映射的Java应用程序中工作。实际上,有两个实体可检测和修订,可检测与修订具有一对多的关系,完成了整套完成的修订:
<set name="_Revisions" table="trevision" inverse="true" lazy="true">
<key>
<column name="id_detectable" />
</key>
<one-to-many class="com.company.model.tasks.Revision" />
</set>
另请参阅我发布的this similar question。我现在想要的是将最后一个修订版本放在该类的单独字段中:
<many-to-one name="_LastDoneRevision" column="id_detectable"
class="com.company.model.tasks.Revision" lazy="false" />
我想要实现的目标是始终急切地获取最后一个版本(我在大多数情况下使用它)。除此之外,如果我愿意,我可以获得整套修订版,但默认情况下它会被懒惰地初始化。为此,可能需要使用自定义查询从整个集合中完成最后一次修订。
我认为用公式无法实现,因为它们只是检索一个值,而不是整个实体。我希望能够以某种方式选择many-to-one
关系应该具有的内容。
解决方案可以是to use a view,而不是可检测表本身。这样我可以有一个 VDetectable 实体,它将映射到视图,视图可以获得所有原始属性以及对我感兴趣的修订的引用。
无论如何,是否可以仅使用原始实体加载它?
答案 0 :(得分:3)
我不承诺它有效甚至是正确的方法,但我做了类似的事情......
<many-to-one
name="theMaxSetting"
class="myPath.domain.Setting"
formula="(select MAX(s.SETTING_ID) from setting s where s.profile_id = PROFILE_ID)"
/>
在我的情况下,个人资料有很多设置。公式有点棘手,但基本上公式返回一个数字,而hibernate使用该数字来查找相应的实体。
只是说明显而易见的情况...... Profile.java现在包含
private Setting theMaxSetting;
//....
//getter / setter
此link显示了使用公式的各种示例。一些示例演示了如何将其与sql查询一起使用,其他示例表明它可用于返回实体。我不认为有一个将它们组合成一个用例,但所有的部分都在那里。
答案 1 :(得分:1)
是的,公式是您想要的解决方案。只需为Hibernate提供一个计算您想要链接的实体的主键的公式。我想你的xml看起来像是:
<many-to-one name="_LastDoneRevision"
class="com.company.model.tasks.Revision" lazy="false">
<formula>
(select max(r.id_revision)
from revision r
where r.id_detectable = id_detectable)
</formula>
</many-to-one>