【问题标题】:JPA: how to override collection table of element collection in subclassJPA:如何覆盖子类中元素集合的集合表
【发布时间】:2020-12-04 16:28:45
【问题描述】:

情况:我有一个抽象的 java 类和两个子类。抽象类包含字符串的集合。 这两个子类都有自己的数据库表,其中的字符串集合也应该保存在自己的数据库表中,具体取决于子类。 我在这里使用 jpa 元素集合。 ActiveResult 类的设置工作正常。但是对于 ArchivedResult,我不知道如何覆盖集合表,以便它可以从自己的 archived_result_values 表中读取。

此设置的结果:从 ArchivedResult 读取时,它找不到集合的值,因为它试图从超类的 active_result_values 表中找到它们,而不是在archived_result_values 表。

我希望在不更改 Java 类的情况下是可能的(因为我不应该这样做),所以我对如何相应地更改 hibernate orm.xml 映射感兴趣。

提示:真实表 archived_result / active_result 有更多(相同的列),但这些与问题无关。

跟随java代码

public abstract class AbstractResult {
  protected String Id;
  protected List<String> values;
}

public class ArchivedResult extends  AbstractResult {
  public ArchivedResult() {
    super();
  }
}

public class ActiveResult extends  AbstractResult {
  public ActiveResult() {
    super();
  }
}

这里是 orm.xml 映射

<entity-mappings .... >
  <mapped-superclass class="com.test.AbstractResult" access="FIELD">
    <attributes>
        <id name="Id">
            <column name="ar_id" />
        </id>
        
        <element-collection name="values" fetch="EAGER">
            <order-column name="item_index" />
            <column name="result_value" />
            <collection-table name="active_result_values">
                <join-column name="ar_id" />
            </collection-table>
        </element-collection>
        
    </attributes>
</mapped-superclass>
    
<entity name="ActiveResult" class="com.test.ActiveResult" access="FIELD">
    <table name="active_result" />
    <inheritance strategy="TABLE_PER_CLASS"/>
</entity>

<entity name="ArchivedResult" class="com.test.ArchivedResult"
        access="FIELD">
    <table name="archived_result" />
    <inheritance strategy="TABLE_PER_CLASS"/>
    <attributes>
        <element-collection name="values" fetch="EAGER">
            <order-column name="item_index" />
            <column name="result_value" />
            <collection-table name="archived_result_values">
                <join-column name="ar_id" />
            </collection-table>
        </element-collection>
    </attributes>
</entity>
</entity-mappings>

【问题讨论】:

  • 我认为覆盖收集表是不可能的。可能更好地为每个类分别映射集合。如果你需要从超类中访问getValues(),只需将其抽象化
  • 感谢您的评论。没错,这种方式是可以的。我希望有另一种方式,但似乎没有(目前)。

标签: java hibernate jpa collections


【解决方案1】:

如果要重用契约,请将getter和setter定义为基类中的抽象方法,并在子类中实现。

【讨论】:

  • 谢谢,但是 crizzy 已经提到的基本相同,请参阅我的评论。
  • 再想一想,您是否尝试过将注释模型与@AssociationOverride 一起使用?这可能对你有用,但不知道如何在 hbm.xml 中建模
  • 它和你在xml中写的完全一样......不,这也不起作用,我已经测试过了。
猜你喜欢
  • 1970-01-01
  • 2020-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多