Стратегия объединения по наследству с несколькими неключевыми столбцами

StackOverflow https://stackoverflow.com/questions/4168919

Вопрос

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

Возможно, я даже делаю это неправильно.Буду признателен за любую помощь или предложения.Спасибо!

Это было полезно?

Решение

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

Видеть,http://en.wikibooks.org/wiki/java_persistence/table#multiple_table_with_foreign_keys.

При использовании ECLIPSELINK вы можете определить любой тип присоединения к вам, желаете использовать дескрипторCustomizer и AddForeignkefieldNameFormultiPletable ().

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

Другие советы

Я не уверен, как @Inheritance решает, какой столбец использовать для объединения, но я предполагаю, что по умолчанию он использует первичный ключ(и).

Это правильно, и это объясняется в следующем разделе спецификации JPA 1.0.

9.1.32 Аннотация PrimaryKeyJoinColumn

А PrimaryKeyJoinColumn Аннотация указывает столбец первичного ключа, который используется в качестве иностранного ключа для соединения к другой таблице.

Первичная аннотация Keyjoincolumn используется для присоединения основной таблицы подкласса сущности в объединенной стратегии отображения к основной таблице его суперкласса;он используется внутри SecondaryTable аннотация, чтобы присоединиться к вторичной таблице к первичной таблице;и его можно использовать в OneToOneКартирование, в котором основной ключ объекта ссылки используется в качестве иностранного ключа к упомянутой сущности.

...

Если нет PrimaryKeyJoinColumnаннотация указана для подкласса в JOINED Предполагается, что стратегия отображения, столбцы иностранного ключа имеют те же имена, что и основные столбцы клавиш первичной таблицы суперкласса.

...

И приведенная выше аннотация (или PrimaryKeyJoinColumns при использовании составных клавиш) дает вам некоторый контроль над имя столбца первичного ключа текущей таблицы и имя столбца первичного ключа таблицы, к которой присоединяется.

Я хотел бы объединить их не с одним столбцом, кроме первичного ключа, а с двумя, в данном случае столбцом1 и столбцом2.

Я не уверен, что это сработает, но я бы попробовал следующее (в подклассе):

@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»
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top