Hibernate:映射@OneToMany 关系的最后一行

Posted

技术标签:

【中文标题】Hibernate:映射@OneToMany 关系的最后一行【英文标题】:Hibernate: map last row of a @OneToMany relation 【发布时间】:2011-09-27 11:03:12 【问题描述】:

我在元素和它的名字之间有一个关系。所有历史名称以及当前名称都位于具有字段“created”的表“element_name”中。最后创建的行是元素的当前名称。

如何将元素的当前名称映射为元素的属性?

class Element implements Serializable 

    @OneToMany(fetch = FetchType.LAZY)
    private List<ElementName> historyOfElementNames;

    // What annotations should be used here?
    private ElementName currentElementName;

    ...

提前致谢!

【问题讨论】:

【参考方案1】:

您的解决方案的替代方法是映射列表中的所有名称,对该列表进行排序,然后将当前名称设为elementNames.get(elementNames.size() - 1)

要启用此功能,请添加 @IndexColumn 注释以及实际的索引列和索引。这样您还可以获得名称更改的顺序。

编辑:从 Hibernate 3.5 开始,@IndexColumn 似乎已重命名为 @OrderColumn

【讨论】:

@user966810 好吧,我似乎没有一种简单的方法可以仅使用注释来实现这一点。您可以将currentElementName 设为一个集合并应用过滤器(@Filter 注释)以仅选择最新的。由于您将这两个属性映射到一个表/列,请记住其中一个属性需要是只读的 (insertable = false, updatable = false)。 这在某些情况下会起作用,但那样我可能无法根据名称过滤一堆元素(实际上我的元素对其状态有相同的想法,这通常是条件条款)。通过使用公式注释,我几乎实现了我所需要的,但事实证明,公式只能用于映射字段而不是对象。

以上是关于Hibernate:映射@OneToMany 关系的最后一行的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate - OneToMany 单向映射 - SQLGrammarException

Hibernate OneToMany SELECT 在实体的映射中给出重复的列

笔记:Hibernate 持久化类标注示例-双向1-N关系映射

如何使用 Hibernate Criteria 连接两个具有 OneToMany 关系的表

Hibernate关系映射

Hibernate学习———— 一对多映射关系