Spring Data / Hibernate: сопоставление на основе производного класса - PullRequest
0 голосов
/ 07 мая 2020

У меня довольно простая Java иерархия объектов, которую я пытаюсь сопоставить с моей реляционной базой данных с помощью спящего режима Spring Data. Хотя приведенные ниже классы являются поддельными, они действительно представляют мою иерархию объектов довольно точно.

public class Fruit {   
    // common fields to all fruits
    // getters, setters
}

public class Apple extends Fruit {
    // fields unique to apples
    // getters, setters
}

public class Orange extends Fruit {
    // fields unique to oranges
    // getters, setters
}

public class Food {
    ...
    ...
    private Fruit fruit;
    // getters, setters
}

Fruit , Apple и Orange не действительно моя проблема. Я могу сопоставить их с их таблицами, используя соответствующие аннотации: @MappedSuperclass, @Inheritance (strategy = InheritanceType.TABLE_PER_CLASS), @Entity (...), @Column (...), et c ...

Моя проблема с классом Food . С точки зрения OOP мой класс Food является своего рода c для повторного использования и использует базовый класс Fruit в качестве члена «fruit» вместо производного класса, такого как Orange или Apple.

Допустим, у нас есть это:

Food myFood = new Food();
myFood.setFruit(new Apple());

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

Есть 3 таблицы (@Entity), с которыми я работаю здесь:

Food:    id | fruit_id | thing1 | thing2 | etc...
Orange:  id | thing1   | thing2 | etc...
Apple:   id | thing1   | thing2 | etc...

fruit_id @ Food, а не FK, потому что он может ссылаться на Таблица Apple или Orange содержит «идентификатор» строки из соответствующей записи таблицы Orange или Apple. Как бы эти таблицы даже должны были выглядеть, чтобы приспособиться к этому!?

Я не уверен, как указать гибернации, чтобы выбрать Apple, а не Orange, или, если это вообще возможно, мне так не кажется, поэтому я ' Возможно, вам понадобится go еще один маршрут, более ручной.

Спасибо за любую помощь, и я надеюсь, что я достаточно ясно объяснил, что пытаюсь сделать.

1 Ответ

0 голосов
/ 09 мая 2020

Поскольку у вас есть три разных таблицы для подтипов, вы должны объявить Fruit как это

@Entity
@Inheritance(TABLE_PER_CLASS)
public abstract class Fruit { ... }

Использование @MappedSuperclass неверно и должно использоваться только в том случае, если вы хотите повторно использовать состояние. Отображенный суперкласс не запрашивается. Остальное должно работать из коробки.

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