1

我正在使用 Hibernate 3.6.9 作为 ORM 和 xml 映射的 Java 应用程序。实际上,有两个实体,DetectableRevisionDetectable与Revision有一对多的关系,它的整个完成的修订集被映射:

<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>

另请参阅我发布的类似问题。我现在想要的是在类的一个单独字段中获得最后一个修订:

<many-to-one name="_LastDoneRevision" column="id_detectable"
            class="com.company.model.tasks.Revision" lazy="false" />

我想要实现的是总是急切地获取最新版本(我在大多数情况下使用的)。除此之外,如果我愿意,我可以获得整套修订,但默认情况下它是惰性初始化的。为此,可能需要使用自定义查询从整个集合中完成最后一次修订。

我认为这不能用公式来实现,因为它们只是检索一个值,而不是整个实体。我希望能够以某种方式选择many-to-one关系应该具有的内容。

一种解决方案可能是使用视图而不是Detectable表本身。这样我就可以拥有一个VDetectable实体,该实体将映射到视图,并且视图可以获得所有原始属性以及对我感兴趣的修订版的引用。

无论如何,是否可以仅使用原始实体加载它?

4

2 回答 2

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

链接显示了使用公式的各种示例。一些示例演示了它如何与 sql 查询一起使用,其他示例演示它可用于返回实体。我不认为有一个将它们组合成一个用例,但所有的部分都在那里。

于 2014-08-27T14:52:25.600 回答
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>
于 2014-08-27T16:10:24.890 回答