【问题标题】:Hibernate derived EntityHibernate 派生实体
【发布时间】:2013-10-10 10:09:27
【问题描述】:

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

<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,而不是Detectable 表本身。这样我就可以有一个 VDetectable 实体,该实体将映射到视图,并且视图可以获得所有原始属性以及对我感兴趣的 Revision 的引用。

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

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    我不保证它是有效的,甚至是正确的方法,但我做过类似的事情......

    <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 查询一起使用,其他示例演示它可用于返回实体。我不认为有一个将它们组合成一个用例,但所有部分都在那里。

    【讨论】:

    • 感谢您的回答。如果您能够在显示应用此方法的网络中提供一些参考,我将不胜感激。
    • 感谢您的链接,无论如何我不知道可以以这种方式使用公式(如果您查看参考,它仅显示具有实体属性而不是 id 本身的示例) .它工作正常,如果有人提供不同的方式,我只是等待。
    【解决方案2】:

    是的,公式就是您想要的解决方案。只需为 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>
    

    【讨论】:

      猜你喜欢
      • 2011-12-22
      • 1970-01-01
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      • 2014-04-28
      • 2015-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多