Я пытаюсь использовать 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 - Можете ли вы ответить на этот вопрос?