Стратегия наследования с несколькими столбцами без ключа - PullRequest
1 голос
/ 12 ноября 2010

У меня есть два класса 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.

Я мог бы даже ошибиться. Буду признателен за любую помощь или предложения. Спасибо!

Ответы [ 2 ]

2 голосов
/ 15 ноября 2010

JPA позволяет объединять только несколько таблиц или унаследованных таблиц столбцами Id. Какой провайдер JPA вы используете? Некоторые предоставляют другие варианты.

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

Если вы используете EclipseLink, вы можете определить любой тип объединения по вашему желанию, используя DescriptorCustomizer и addForeignKeyFieldNameForMultipleTable ().

В противном случае, если вы не можете изменить схему, вы можете попытаться создать представление, которое выполняет объединение, и использовать наследование TABLE_PER_CLASS и отобразить подкласс на представление.

2 голосов
/ 13 ноября 2010

Я не уверен, как @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 жаловаться или нет.

Ссылки

  • JPA 1.0 Спецификация
    • Раздел 9.1.32 «Аннотация PrimaryKeyJoinColumn»
    • Раздел 9.1.33 «Аннотация PrimaryKeyJoinColumns»
...