JPA отношения и полиморфизм - PullRequest
2 голосов
/ 16 ноября 2010

У меня есть следующая структура класса (детали опущены для ясности):

Например:

@Entity
class A{

@OneToMany
private List<B> b;

@OneToOne
private C c;


}

interface B {

}

@Entity
@Inheritance
abstract class Babstract implements B {

}

@Entity
@PrimaryKeyJoinColumn
class B1impl extends Babstract  {

}

@Entity
@PrimaryKeyJoinColumn
class B2Impl extends Babstract {

}

Я хочу загрузить все B принадлежащие C.C. B и C не знают о существовании друг друга, и мне нравится так держать.Я не знаю фактический тип реализации B, и мне все равно, потому что я использую абстрактный тип данных B (интерфейс).Реализация может изменяться с течением времени, например, новая реализация B может быть добавлена ​​в будущем в новой версии.

Возможно ли это с JPA и как мне это сделать?Я не могу использовать атрибут targetEntity, если я прав, потому что я не знаю реализующий класс и мне все равно.B полиморф.

Ответы [ 2 ]

1 голос
/ 16 ноября 2010

JPA не поддерживает интерфейс, но есть у некоторых поставщиков JPA.Если вы используете EclipseLink, вы можете использовать отображение @VariableOneToOne для сопоставления с интерфейсом.

Теперь, если в интерфейсе B есть только один текущий реализатор, а это всего лишь «возможное время в будущем»,будет просто установить targetEntity для Babstract.Если «какое-то возможное время в будущем» действительно произойдет (вероятно, не произойдет), тогда вы можете изменить сопоставления.

См., http://en.wikibooks.org/wiki/Java_Persistence/Advanced_Topics#Interfaces

1 голос
/ 16 ноября 2010

JPA плохо работает с интерфейсами. Вам нужно сделать B хотя бы абстрактным классом с аннотацией сущности. Вы можете сделать B полностью пустым абстрактным классом (кроме поля id, в котором вы нуждаетесь), а затем добавить наследование. Причина этого заключается в том, что для того, чтобы у объекта была ссылка на другой объект, должен существовать способ ссылки на этот объект в базе данных - и если нет таблицы для B, то сделать это невозможно. 1001 *

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