【发布时间】: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