JPA / Hibernate наследование с несколькими уровнями и таблицами. - PullRequest
0 голосов
/ 01 декабря 2011

Итак, у меня есть эта структура.

Идентификатор таблицы1 поле1 поле2 распознавания Значение

Идентификатор таблицы2 поле3

Идентификатор таблицы3 поле4

И я хочу использовать наследование следующим образом.

@DiscriminatorColumn("discriminatorValue")
@Entity
@Inheritance
@Table("Table1")
public class T1  {

@Id
private int id;
...

private String field1;
..
private String field2;
..
}

@SecondaryTable(name = "Table2", pkJoinColumns = {@PrimaryKeyJoinColumn(name = "id",     referencedColumnName = "id")})
@DiscriminatorValue("tbl2")
@Entity
public class T2 extends T1 {

private String field3;
..
}

@SecondaryTable(name = "Table3", pkJoinColumns = {@PrimaryKeyJoinColumn(name = "id",     referencedColumnName = "id")})
@DiscriminatorValue("tbl3")
@Entity
public class T3 extends T2 {

private String field4;
..
}

Я обнаружил, что при попытке сохранить объект T3 дополнительная таблица из T2 не включается.

Спасибо

Ответы [ 3 ]

1 голос
/ 01 декабря 2011

Похоже, вы используете стратегию наследования SINGLE_TABLE, но явно разделяете некоторые свойства в подклассах на отдельные таблицы, а не используете стратегию объединенных подклассов.

Это кажется стандартнымподход к смешиванию стратегий наследования

См .: Как смешать стратегии наследования с аннотациями JPA и Hibernate?

Отображение многоуровневого наследования в Hibernate с аннотациями

Единственное, что вам может не хватать, - это указать, какие поля идут в какие столбцы.@SecondaryTable не привязан к иерархии наследования - вы можете использовать его в одном классе - и, следовательно, вы должны явно указать, что поле в дочернем классе отображается на вторичную таблицу.

Таким образом, в T2 вам, наверное, нужно

@Column(table="tbl2")
private String field3;

и в T3

@Column(table="tbl3")
private String field4;

Удачи!

0 голосов
/ 02 февраля 2016
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class Project {
  @Id
  private long id;
}


@Entity
@Table(name="LARGEPROJECT")
public class LargeProject extends Project {
  private BigDecimal budget;
}
0 голосов
/ 02 декабря 2011

Разобрался.Если во вторичной таблице нет данных ни в одном из полей, строка не вставляется.

Так что в моем случае поле field3 не имело данных, поэтому T2 не был вставлен, а поскольку вторичная таблица в T3 была связана со строкой в ​​T2, все это распалось.

О, и еще одна вещь, которую я нахожу, это то, что вы не можете установить значение по умолчанию для поля в средней таблице, чтобы попытаться принудительно создать его.IE делает либо

private String field2 = "test";

, либо

public T2(){
  setField2("test");
}

не работает.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...