2013-10-10 171 views
1

我正在使用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实体和视图可以获取所有原始属性加上参考修订我感兴趣的

反正是有可能是否只使用原始实体加载?

回答

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)" 
/> 

在我的情况下,配置文件有许多设置。该公式有点棘手,但基本上公式返回一个数字,休眠使用该数字来查找相应的实体。

只是不言自明的情况下... Profile.java现在包含

private Setting theMaxSetting; 
//.... 
//getter/setter 

link显示了使用配方的各种例子。一些示例演示了如何将它用于sql查询,其他示例演示了它可用于返回实体。我不认为有一个将它们合并成一个用例,但所有的部分都在那里。

+0

感谢您的回答。如果您能够在网络中提供此方法显示的应用参考,我将不胜感激。 –

+0

回答更新了Web引用。 – user2046211

+0

感谢您的链接,无论如何,我不知道公式可以用于这种方式(如果你看看引用,它只显示实例属性,而不是id本身)。它工作正常,如果有人提供不同的方式,我只能等待。 –

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>