Что было бы наилучшим решением для реализации следующей ситуации с Hibernate.
Мы определяем абстрактный класс, который станет основой любого объекта, который мы хотим сохранить в нашей базе данных.Он содержит идентификатор и т. Д. И т. Д. *
public abstract class ModelObject {
protected int id;
...
}
Теперь мы создадим подкласс нашего базового предложения для особых случаев, когда более чем у одной сущности будут одинаковые поля.все классы, которые мы хотим иметь Nose
:
public class Person extends ModelObjectWithNose { ... }
public class Animal extends ModelObjectWithNose { ... }
Реальная проблема, с которой мы сталкиваемся сейчас, заключается в том, что эти отношения должны быть двунаправленными.Каждый конкретный класс должен знать, какой Nose
является их собственным, но каждый Nose
также должен знать, к какому объекту он принадлежит.
public class Nose {
...
private ModelObjectWithNose owner;
}
Для нашего примера нам нужны отношения @OneToOne
, так как каждыйPerson
может иметь только один Nose
, и каждый Nose
может принадлежать только одному Person
.
. Мы попытались сделать следующее:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class ModelObjectWithNose extend ModelObject { ... }
, а затем:
@Entity
public class Person extends ModelObjectWithNose { ... }
... и т. Д. И т. Д.
1) Как определить отношение между Nose
и ModelObjectWithNose
?Это так же просто, как:
@Entity
public class Nose {
...
// this causes: 'Basic' attribute should not be 'Persistence Entity'
ModelObjectWithNose owner;
}
2) Есть ли лучший / более предпочтительный способ?Будет ли стратегия наследования работать правильно?
Спасибо!
РЕДАКТИРОВАТЬ
Итак, я попробовал несколько способов, которые, кажется, все потенциально работают.Использование любой из трех схем наследования работает нормально, если вы настроили аннотации, как в вопросе.К сожалению, это оказывает огромное влияние на нашу существующую базу данных и код, поэтому мы решили (на данный момент) просто проиндексировать поле Nose
объекта id
, которое хранится в наших текущих объектах, которые расширили бы ModelObjectWithNose
, и просто написать помощникметоды выполнения точечных запросов для поиска записей.