如何实现具有泛型关系的多态 JPA 实体
我正在尝试使用 JPA 2.0 创建具有泛型关系的多态实体。应该有两个表,一个事件表和一个通知表。这些表内部是彼此相关的具体实体,如下所示:
Event <---------- Notification<X extends Event>
| |
LoginEvent <------ LoginNotification extends Notification<LoginEvent>
从逻辑上讲,这应该可以在休眠状态下实现,就像在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<X extends Event>{
@ManyToOne(optional=false, targetEntity=Event.class)
@JoinColumn
private X event;
...
}
@Entity
public class LoginNotification extends Notification<LoginEvent>{
...
}
使用此代码,我可以持久保存并获取任何事件,通知,LoginEvent或 NotificationEvent,但是当我尝试在JPA 2.0元模型查询中使用关系时,它会下降。此问题解释了类似内容。LoginNotification_.event
public static volatile SingularAttribute<NotificationEntity, EventEntity> event;
当我尝试在条件查询中进行联接时,我收到一个错误:
EntityManager em = getEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<LoginNotification> query = cb.createQuery(LoginNotification.class);
Root<LoginNotification> root = query.from(LoginNotification.class);
// This line complains: Type mismatch: cannot convert from
// Join<LoginNotification,Event> to Join<LoginNotification,LoginEvent>
Join<LoginNotification, LoginEvent> 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<LoginNotification, LoginEvent> event;
...
}
根据一些帖子,泛型关系将不起作用(如何处理指向泛型接口的指针的JPA注释),但是通过使用注释,我们可以使它们运行。不幸的是,泛型似乎破坏了 JPA 条件查询。@ManyToOne(optional=false, targetEntity=Event.class)
对于如何执行此查找,是否有任何建议?我可以在代码中使用,但不能在 JPA 元模型连接中使用。使用泛型来实现此目的的替代方法是什么?LoginNotification.getEvent()
LoginNotification_.event
@Pascal Thivent - 你能回答这个问题吗?