我有两个类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
。
我甚至可能以错误的方式解决这个问题。我很感激任何帮助或建议。谢谢!
答案 0 :(得分:2)
我不确定@Inheritance如何决定使用哪个列来加入,但我默认它会使用主键。
这是正确的,这在JPA 1.0规范的以下部分中进行了解释
9.1.32 PrimaryKeyJoinColumn Annotation
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提供商是否会抱怨。
答案 1 :(得分:2)
JPA只允许Id列连接多个表或继承的表。您使用的JPA提供商是什么?有些提供其他选择。
请参阅, http://en.wikibooks.org/wiki/Java_Persistence/Tables#Multiple_tables_with_foreign_keys
如果使用EclipseLink,您可以使用DescriptorCustomizer和addForeignKeyFieldNameForMultipleTable()定义所需的任何类型的连接。
否则,如果您无法更改架构,则可以尝试创建一个执行连接的视图,并使用TABLE_PER_CLASS继承并将子类映射到视图。