Как реализовать полиморфные объекты JPA с общими отношениями

Я пытаюсь использовать JPA 2.0 для создания полиморфных сущностей с общими отношениями. Должно быть две таблицы, таблица событий и таблица уведомлений. Внутри этой таблицы находятся конкретные объекты, которые связаны друг с другом, например так:

Event  <---------- Notification
 |                      |
LoginEvent <------ LoginNotification extends Notification

Логически это должно быть возможно в спящем режиме, как это возможно в SQL:

+----------+    +----------+
| Event    |    | Notif    |
+----------+    +----------+
|          |    | Id       |
| Id       | <- | Evt_id   |
| Type     | <- | Type     |
| ...      |    | ...      |
+----------+    +----------+

Вот что у меня есть:

@Entity
@Inheritance
public abstract class Event{

...
}

@Entity
public class LoginEvent extends Event{

...
}

@Entity
@Inheritance
public abstract class Notification{

 @ManyToOne(optional=false, targetEntity=Event.class)
 @JoinColumn
 private X event;

...
}

@Entity
public class LoginNotification extends Notification{

...
}

Используя этот код, Я могу сохранить и получить любое событие, уведомление, LoginEvent или NotificationEvent, но оно падает, когда я пытаюсь использовать отношение LoginNotification_.event в моих запросах метамодели JPA 2.0. Эта проблема объясняет нечто подобное.

public static volatile SingularAttribute event;

Когда я пытаюсь выполнить соединение в запросе критериев, я получаю сообщение об ошибке:

EntityManager em = getEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery query = cb.createQuery(LoginNotification.class);
Root root = query.from(LoginNotification.class);

//  This line complains: Type mismatch: cannot convert from
//  Join to Join
Join join = 
root.join(LoginNotification_.event, JoinType.INNER);

Я могу обойти эту ошибку, добавив новый SingularAttribute в метамодель LoginNotification_ , но это не выполняется:

public abstract class LoginNotification_ extends Notification_ {

    // Adding this Removes Type mismatch error, but causes run-time error
    public static volatile SingularAttribute event; 

    ...
}

Согласно некоторым сообщениям, общие отношения не будут работать ( Как обрабатывать JPA аннотации для указателя на общий интерфейс ), но используя аннотацию @ManyToOne (optional = false, targetEntity = Event.class) , мы можем заставить их вести себя. К сожалению, дженерики, похоже, нарушают запрос критериев JPA.

Есть ли какие-нибудь предложения, как я могу выполнить этот поиск? Я могу использовать LoginNotification.getEvent () в моем коде, но я не могу использовать LoginNotification_.event в своих соединениях метамодели JPA. Какой' s альтернатива использованию дженериков для достижения этой цели?

@Pascal Thivent - Можете ли вы ответить на этот вопрос?

15
задан logan 16 July 2012 в 21:47
поделиться