Значение @Inheritance по умолчанию равно SINGLE_TABLE, или оно по умолчанию равно «падающему» ИЛИ SINGLE_TABLE? - PullRequest
1 голос
/ 08 марта 2012

Рассмотрим следующий сценарий:

(Следующие вещи были опущены: конструкторы, методы получения и установки, аннотации @Column, аннотации @Basic, аннотации @Table, объявления импорта и пакета. Остальное ТОЛЬКО какЯ предполагаю, что это будет (даже пустые аннотации))

@Inheritance(strategy=InheritanceType.JOINED)
@Entity
public class A {
    @Id @GeneratedValue
    private long id;
    private String aValue;//There are getters and setters for this, but I omitted them
}

@Entity    
public class B extends A {
    private String bValue;
}

//Missing @Inheritance here - JPA2 says "default" @Inheritance if it is missing
//But what does that mean?
@Entity
public class C extends A {
    private String cValue;
}

@Entity
public class D extends C {
    private String dValue;
}

//Missing strategy, whose default, according to the annotation interface, is SINGLE_TABLE
@Inheritance
@Entity
public class E extends C {
    private String eValue;
}

@Entity
public class F extends E {
    private String fValue;
}

@Entity
public class G extends E {
    private String gValue;
}

Краткий обзор классов без синтаксиса:

A (@Inheritance(strategy=InheritanceType.JOINED)
B, C (no annotation)
   D, E (@Inheritance)
      F, G

Если вы должны следовать спецификации JPA, должно быть

  • A: таблицы для A, B, C, D, E, F и G, все из которых содержат id + classValue
  • B: таблицы для A, B, C, D и {EFG}, с A, B, C & D, содержащим id + classValue, и {EFG}, содержащим id + eValue + fValue + gValue + DTYPE
  • C: таблицы для A, B и {CDEFG}, с Aи B содержит id + classValue и {CDEFG} содержит id + cValue + dValue + eValue + fValue + gValue + DTYPE

Или это какой-то другой сценарий, о котором я еще не думал?Я бы протестировал его, но я не уверен, будет ли это реализация JPA или сама спецификация, заполняющая пробелы: «Что происходит, когда аннотация @Inheritance не пропущена, но имеет неопределенную стратегию»?Лично я уверен, что C не произойдет, но я не знаю, будет ли он отображаться как A или B.

Отсюда и название вопроса: по умолчанию для @Inheritance установлено значение "SINGLE_TABLE" (независимо от того,он отсутствует или не определен), или он по умолчанию имеет значение «падение» (проверьте, как иерархия сущностей выше имеет дело с вещами) и, если это невозможно, «SINGLE_TABLE»?А что, если аннотация есть, но стратегия не определена?

Ответы [ 3 ]

2 голосов
/ 09 марта 2012

Я думаю, что правильный ответ: «Это зависит от вашей реализации». Из спецификации JSR (JSR317 §2.12 «Стратегии отображения наследования»):

Поддержка комбинации стратегий наследования в иерархии наследования одной сущности не требуется в данной спецификации.

В этом случае корнем вашей иерархии является A, с явно указанным JOINED, поэтому у вас будут таблицы для каждой сущности.

Теперь, если ваша реализация JPA поддерживает несколько типов наследования для каждой иерархии, судя по Javadoc и Source аннотации, я лично ожидаю, что будут таблицы для A, B, C, D, {EFG}

Как вы указали, если аннотация присутствует, стратегия будет SINGLE_TABLE, если не указано иное. Поскольку Javadoc и Spec ссылаются на обработку @Inheritance в терминах иерархий классов, я думаю, что если текущий класс не имеет аннотации, я смотрю на родительский элемент и вверх по дереву, пока не найду аннотацию, или я достигаю корня иерархии классов (и по умолчанию SINGLE_TABLE)

1 голос
/ 09 марта 2012

Для меня это не на 100% ясно, делает ли следующее в спецификации JPA 2.0

Support for the combination of inheritance strategies within a single entity 
inheritance hierarchy is not required by this specification.

означает, что:

  1. если реализовано, должно учитывать все другие представленные ограничения (большинство скорее всего) или
  2. , если реализовано, может ослабить другие представленные ограничения.

К счастью, эталонная реализация выбрала первый вариант. При использовании EclipseLink @Inheritance без аргумента по умолчанию используется одиночная таблица, и при этом аннотация @Inheritance не используется при всех отличиях @ Аннотация наследования, найденная в суперклассе (не обязательно должна быть непосредственным суперклассом). Эти объекты будут сопоставлены с пятью таблицами:

  • A: id dtype avalue
  • B: id bvalue
  • C: идентификатор cvalue
  • D: id dvalue)
  • E: id evalue, fvalue, gvalue

(B-E id от FK до A id)

Сохраняющиеся сущности работают как положено, каждая сущность также без проблем сохраняется в таблицах суперклассов.

0 голосов
/ 08 марта 2012

вам нужно добавить наследственную аннотацию с параметром дискриминатора, чтобы увидеть всю информацию об этом материале, просто посетите [ссылка] http://www.java2s.com/Code/Java/JPA/SetDiscriminatorValue.htm

...