Повторное использование иерархии объектов JPA в двух схемах - PullRequest
0 голосов
/ 10 августа 2011

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

   [Parent1]         [Parent2]
         \1            1/
          \            /
           \0..*  0..*/
         [ChildSuperclass]               -- @Inheritance(SINGLE_TABLE)
                 ^
                /_\
        _________|_________
       |                   |
[ChildSubclass1]    [ChildSubclass2]

Я бы хотел иметь четыре стола:

  • PARENT1
  • CHILD1
  • PARENT2
  • CHILD2

где CHILD1 и CHILD2 отображаются так, что иерархия классов и реализация могут быть общими. В идеале PARENT1 / CHILD1 и PARENT2 / CHILD2 должны быть в отдельных схемах, но я должен использовать одну единицу персистентности.

Мне нужно отношение к суперклассу, поэтому кажется, что @MappedSuperclass - это не вариант. (Однако Родителю 1 не нужно указывать на детей Родителя 2, и наоборот.)

Возможно ли это?

Похоже на это: https://forum.hibernate.org/viewtopic.php?p=2419646 но я вынужден использовать аннотации JPA. Аннотации, относящиеся к Hibernate, являются опцией, а XML - нет.

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

Обновление Надеюсь, я смогу уточнить на более конкретном примере.

   [RedPerson]     [BluePerson]
         \1            1/
          \            /
           \0..*  0..*/
           [Automobile]               -- @Inheritance(SINGLE_TABLE)
                 ^
                /_\
        _________|_________
       |                   |
     [Sedan]    [PickupTruck]

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

1 Ответ

0 голосов
/ 10 августа 2011

Вы должны использовать аннотацию @DiscriminatorColumn.

@Entity
@Inheritance(strategy=SINGLE_TABLE)
@DiscriminatorColumn(name="childtype", discriminatorType=INTEGER)
public class ChildSuper{}

@Entity
@DiscriminatorValue("child1")
public class Child1{}

@Entity
@DiscriminatorValue("child2")
public class Child2{}

Затем Parent1 может отображаться на Child1, а Parent2 и сопоставляться с Child2. Но у вас все еще есть ChildSuper в качестве ссылочного типа и общего кода. И вы можете использовать его для запроса.

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