具有多个非键列的继承连接策略
Posted
技术标签:
【中文标题】具有多个非键列的继承连接策略【英文标题】:Inheritance Joined Strategy With Multiple Non-Keyed Columns 【发布时间】:2010-11-12 20:47:18 【问题描述】:我有两个类 Foo
和 Bar
映射到两个不同的表,我希望它们使用 JOINED
继承策略,但使用两个非键列连接。架构很奇怪,但我坚持下去。这是我的设置:
@Entity
@Table(name="foo")
@Inheritance(strategy=InheritanceType.JOINED)
public class Foo
@Id
private Integer uniqueFooId;
@Column(name="column1")
private String column1;
@Column(name="column2")
private String column2;
@Column(name="someValue")
private String someValue;
@Entity
@Table(name="bar")
public class Bar extends Foo
@Id
private Integer uniqueBarId;
@Column(name="column1")
private String column1;
@Column(name="column2")
private String column2;
@Column(name="someOtherValue")
private String someOtherValue;
我不确定@Inheritance 如何决定使用哪一列加入,但我假设默认情况下它使用主键。我想加入它们的不仅仅是主键以外的一列,而是两列,在本例中为 column1
和 column2
。
我什至可能会走错路。我将不胜感激任何帮助或建议。谢谢!
【问题讨论】:
【参考方案1】:JPA 仅允许通过 Id 列连接多个表或继承的表。您使用的是哪个 JPA 提供程序?有些提供其他选项。
看, http://en.wikibooks.org/wiki/Java_Persistence/Tables#Multiple_tables_with_foreign_keys
如果使用 EclipseLink,您可以使用 DescriptorCustomizer 和 addForeignKeyFieldNameForMultipleTable() 定义您想要的任何类型的连接。
否则,如果您无法更改架构,您可以尝试创建一个执行连接的视图,并使用 TABLE_PER_CLASS 继承并将子类映射到视图。
【讨论】:
【参考方案2】:我不确定@Inheritance 如何决定使用哪个列来加入,但我假设默认情况下它使用主键。
这是正确的,这在 JPA 1.0 规范的以下部分中进行了解释
9.1.32 PrimaryKeyJoinColumn 注解
PrimaryKeyJoinColumn
注释 指定一个主键列 用作外键加入 另一个表。PrimaryKeyJoinColumn 注释是 用于连接一个主表 JOINED 映射中的实体子类 对其主表的策略 超类;它在一个内使用
SecondaryTable
注解加入一个 从表到主表; 它可以用于OneToOne
映射其中的主键 引用实体用作 被引用实体的外键。...
如果没有
PrimaryKeyJoinColumn
为子类指定注释 在JOINED
映射策略中, 外键列假定为 与主键同名 主表的列 超类。...
上面的注解(或PrimaryKeyJoinColumns
,当使用复合键时)让您可以控制当前表的主键列的名称和主键的名称正在加入的表的列。
我想加入它们的不仅仅是主键以外的一列,而是两列,在本例中为 column1 和 column2。
我不确定这是否可行,但我会尝试以下方法(在子类中):
@Entity
@Table(name="bar")
@PrimaryKeyJoinColumns(
@PrimaryKeyJoinColumn(name="column1",
referencedColumnName="column1"),
@PrimaryKeyJoinColumn(name="column2",
referencedColumnName="column2")
)
public class Bar extends Foo
@Id
private Integer uniqueBarId;
@Column(name="column1")
private String column1;
@Column(name="column2")
private String column2;
@Column(name="someOtherValue")
private String someOtherValue;
不知道JPA提供者会不会抱怨。
参考文献
JPA 1.0 规范 第 9.1.32 节“PrimaryKeyJoinColumn 注释” 第 9.1.33 节“PrimaryKeyJoinColumns 注释”【讨论】:
以上是关于具有多个非键列的继承连接策略的主要内容,如果未能解决你的问题,请参考以下文章