1

我有两个类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.

我什至可能会以错误的方式解决这个问题。我将不胜感激任何帮助或建议。谢谢!

4

2 回答 2

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 注释”
于 2010-11-13T07:21:33.610 回答
2

JPA 仅允许通过 Id 列连接多个表或继承的表。您使用的是哪个 JPA 提供程序?有些提供其他选择。

见, http ://en.wikibooks.org/wiki/Java_Persistence/Tables#Multiple_tables_with_foreign_keys

如果使用 EclipseLink,您可以使用 DescriptorCustomizer 和 addForeignKeyFieldNameForMultipleTable() 定义所需的任何类型的连接。

否则,如果您无法更改架构,您可以尝试创建一个执行连接的视图,并使用 TABLE_PER_CLASS 继承并将子类映射到视图。

于 2010-11-15T14:21:43.197 回答