Сопоставить суперкласс и подкласс с различными таблицами в Hibernate - PullRequest
1 голос
/ 22 февраля 2011

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

@javax.persistence.Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "MyTable1")
public class MyClass

@javax.persistence.Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "MyTable2")
public class MySubclass extends MyClass

Это работает, но в сгенерированном SQL обе таблицы объединены, и я хочу их разделить.

Другой подход состоял в том, чтобы использовать то же самое, что и выше, но изменить JOINED на TABLE_PER_CLASS. Это не работает, потому что при выполнении запроса MyClass .

в обеих таблицах SQL имеется UNION ALL.

Я также пытался использовать @org.hibernate.annotations.Entity(polymorphism = PolymorphismType.EXPLICIT) и @org.hibernate.annotations.Entity(polymorphism = PolymorphismType.IMPLICIT), но без эффекта.

Так что мой вопрос, есть ли способ отобразить это в Hibernate. Есть предложения?

Спасибо!


Использование Hibernate 3.6.1

Ответы [ 2 ]

4 голосов
/ 22 февраля 2011

Кажется, вы хотите считать эти две сущности совершенно не связанными, за исключением полей, которые у них общие. На самом деле это не отношение наследования, так как при поиске MyClass вы не хотите, чтобы экземпляры MySubclass находились, хотя экземпляры MySubClass являются экземплярами MyClass в вашем проекте.

Таким образом, наилучшим решением, вероятно, является использование MappedSuperclass (см. Главу 2.2.4.4), которое содержит общие поля и методы, и создание двух совершенно отдельных сущностей, расширяющих этот сопоставленный суперкласс.

0 голосов
/ 22 февраля 2011

TABLE_PER_CLASS должен делать то, что вы хотите.

Обратите внимание, что при выполнении запроса, подобного from MyClass m, Hibernate загружает все объекты класса MyClass, включая подклассы, отсюда и предложение UNION ALL.Если вам нужно только MyClass без подклассов, вам нужно использовать следующий запрос: from MyClass m where m.class = MyClass.

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