具有多个非键列的继承连接策略

Posted

技术标签:

【中文标题】具有多个非键列的继承连接策略【英文标题】:Inheritance Joined Strategy With Multiple Non-Keyed Columns 【发布时间】:2010-11-12 20:47:18 【问题描述】:

我有两个类 FooBar 映射到两个不同的表,我希望它们使用 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 如何决定使用哪一列加入,但我假设默认情况下它使用主键。我想加入它们的不仅仅是主键以外的一列,而是两列,在本例中为 column1column2

我什至可能会走错路。我将不胜感激任何帮助或建议。谢谢!

【问题讨论】:

【参考方案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 注释”

【讨论】:

以上是关于具有多个非键列的继承连接策略的主要内容,如果未能解决你的问题,请参考以下文章

创建带包含列的索引 sqlserver

Create Index语句的Include作用

Entity Framework 4.1 - 非键列之间的关系

如何在 Laravel 中获取非键列字段的不同值?

更新非键列查询 Pheonix JDBC

Fluent nHibernate - 如何在联结表上映射非键列?