2016-06-06 2 views
1

У меня есть вопрос относительно аннотации и наследования Hibernate.Hibernate Дополнительное наследование

В базе данных у меня есть таблица parent и таблица child. Таблица parent имеет столбцы, которые не реплицируются в таблице child (отношение joined в спящем режиме). Для каждой строки таблицы child в таблице parent есть строка. В этом случае строка в таблице child и соответствующая строка в таблице parent имеют то же значение id. Однако таблица parent имеет строки, которые не имеют соответствующей строки в строке child.

Конкретный child объекта представлены путем объединения между child и parent и конкретным parent просто представлена ​​в таблице parent.

Объектно-ориентированный способ представления это иметь следующее:

parent класс:

@Entity 
@Table(name = "Parent") 
@Inheritance(strategy = InheritanceType.JOINED) 
public class Parent{ 
    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    private int id; 
    // More properties 
} 

child класс:

@Entity 
@Table(name = "Child") 
@PrimaryKeyJoinColumn(name="id") 
public class Child extends Parent{ 
    // More properties 
} 

Когда я перечисляю все у детей, использующих List child = session.createQuery("FROM Child").list();, все идет хорошо. Однако моя проблема заключается в том, что когда я пытаюсь перечислить родителей, используя List parent = session.createQuery("FROM Parent").list();, он возвращает список объектов child.

Есть ли способ представить «необязательное» наследование в Hibernate?

ответ

3

Если вы непосредственно просматриваете родительский объект из структуры наследования JPA, то субобъекты «самые нижние» определяются реализацией JPA, поскольку они должны сохраняться в постоянной области. Поэтому «необязательное наследование», которое вы упомянули, невозможно в JPA. См. Ответ Hibernate Inheritance Strategy and Why

В вашем случае всегда применяется LEFT OUTER JOIN. Что вы можете сделать:

  1. Вы можете отдать свой результат родительскому объекту из-за наследования. Из-за ненужного соединения вы получите ожидаемый результат, но с производительностью OVERHEAD.

  2. Другой вариант НЕ ИСПОЛЬЗОВАТЬ НАСЛЕДОВАНИЕ. Вместо этого вы можете использовать однонаправленное отношение «один к одному», где дочерний имеет внешний ключ id до родительский. В этой модели вы можете обрабатывать дочернего с его родителем (с использованием CascadeType.ALL), а также запрашивать родительский отдельно без соединений. Один пример: http://www.java2s.com/Tutorial/Java/0355__JPA/OneToOneUnidirectional.htm

1

Родительская таблица содержит столбцы, которые не реплицируются в дочерней таблице (объединенное соотношение в Hibernate)

Если таблица ребенка должен быть подклассом родительской таблицы, то это делает действительно имеет смысл для вас? Подкласс должен иметь все в суперклассе и, возможно, больше.

То, что я думаю, что вы действительно хотите, чтобы смоделировать что-то вроде этого:

@Entity 
@Table(name = "Parent") 
@Inheritance(strategy = InheritanceType.JOINED) 
public abstract class Parent { 
    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    private int id; 
    // More properties 
} 

@Entity 
@Table(name = "Child") 
@PrimaryKeyJoinColumn(name="id") 
public class Child extends Parent { 
    // More properties 
} 

@Entity 
@Table(name = "ConcreteParent") 
@PrimaryKeyJoinColumn(name="id") 
public class ConcreteParent extends Parent { 
    // More properties 
} 

Все общие свойства будут в Parent и ConcreteParent бы все дополнительные столбцы, которые вы хотели положить в родительской таблице.

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

Это, как говорится, взгляните на ответы на аналогичный вопрос: Hibernate: Change instance of base class to subclass.

Дело в том, что ваша модель, вероятно, неверна, если вы пытаетесь использовать наследование, чтобы добавить функциональность к существующей вещи. Наследование полезно для различения разных вещей, которые имеют общие свойства.

Смежные вопросы