У меня довольно простая 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 еще один маршрут, более ручной.
Спасибо за любую помощь, и я надеюсь, что я достаточно ясно объяснил, что пытаюсь сделать.