У меня проблема с наложением JPA. См. Мои сущности ниже. У меня есть Person
, который может быть либо в House
, либо в Car
, но в то же время, конечно. Оба Car
и House
реализуют интерфейс PersonHoldable
. Я знаю, что не могу сопоставить Entity напрямую с интерфейсом.JPA Наследование, отображающее множественные реализации
Это моя модель:
@Entity
public class Person{
private PersonHoldable personHoldable; // either a Car or a House
// This does not work of course because it's an interface
// This would be the way to link objects without taking JPA into consideration.
@OneToOne
public PersonHoldable getPersonHoldable() {
return this.personHoldable;
}
public void setPersonHoldable(PersonHoldable personHoldable) {
this.personHoldable = personHoldable;
}
}
@Entity
public class Car implements PersonHoldable{}
@Entity
public class House implements PersonHoldable{}
public interface PersonHoldable{}
Как я могу отобразить это правильно в JPA принимая во внимание следующее?
- Я пробовал
@MappedSuperclass
об абстрактной реализацииPersonHoldable
. Хотя это будет работать для этой конкретной установки, проблема заключается в том, чтоCar
иHouse
на самом деле реализуют больше интерфейсов. И они сопоставляются с другими объектами. - У
Person
может быть имущество для всех возможныхPersonHoldable
, поэтому в этом случае у него могут быть иgetHouse()
. Мне это не кажется очень гибким. Если бы я добавилBike
, то мне пришлось бы изменить классPerson
. - Я могу сопоставить обратное, так что отношение OneToOne относится только к стороне реализации
PersonHoldable
. Это означало бы добавление свойстваgetPerson()
кPersonHoldable
. Но с точки зренияPerson
это не очень просто, чтобы увидеть, с чем связаноPersonHoldable
. - Я использую JPA по умолчанию, поэтому, по возможности, никаких тегов Hibernate нет.
Если это невозможно при использовании JPA по умолчанию, что было бы лучше всего в этом случае?
Это не поддерживается стандартной JPA. Для сопоставления такой ассоциации понадобится сопоставление hibernate '@ Any'. –
Спасибо, кажется, Hibernate '@ Any' - это всего лишь два столбца, один из которых содержит« тип »и один, содержащий« id ». Может быть реализовано вручную. Это обычная практика? –
Это «ничего более», за исключением того, что он генерирует все соответствующие запросы для вас, например, «выберите p из Person p left join fetch p.personHoldable», и он позволяет перейти к personHoldable, не заботясь о том, какой он тип. Используется ли такая практика? Мне никогда не приходилось использовать его сам. Я бы предпочел определить абстрактный объект, который будет расширяться всеми объектами PersonHoldable. Это будет стандартная JPA. –