Hibernate派生实体

时间:2013-10-10 10:09:28

标签: java hibernate

我正在使用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 实体,它将映射到视图,视图可以获得所有原始属性以及对我感兴趣的修订的引用。

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

2 个答案:

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