我正在尝试使用JPA 2.0创建具有通用关系的多态实体。应该有两个表,一个事件表和一个通知表。在这些表内是彼此相关的具体实体,如下所示:
Event <---------- Notification<X extends Event>
| |
LoginEvent <------ LoginNotification extends Notification<LoginEvent>
从逻辑上讲,这应该在hibernate状态下是可能的,因为在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>{
...
}
使用此代码,我可以持久保存并获取任何Event,Notification,LoginEvent或NotificationEvent,但是当我尝试LoginNotification_.event
在JPA
2.0元模型查询中使用该关系时,它就会掉落。此问题解释了类似的问题。
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批注),但是通过使用@ManyToOne(optional=false, targetEntity=Event.class)
批注,我们可以使它们起作用。不幸的是,泛型似乎破坏了JPA标准查询。
关于如何执行此查找有什么建议吗?我可以LoginNotification.getEvent()
在代码中使用,但不能LoginNotification_.event
在JPA元模型联接中使用。使用泛型来完成此任务的替代方法是什么?
@Pascal Thivent-你能回答这个吗?
一种解决方案是避免使用“ join”功能,而是执行完全交叉联接:
EntityManager em = getEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<LoginNotification> query = cb.createQuery(LoginNotification.class);
Root<LoginNotification> notfRoot = query.from(LoginNotification.class);
Root<LoginEvent> eventRoot = query.from(LoginEvent.class);
...
query.where(cb.equals(notfRoot.get(Notification_.event), eventRoot.get(Event_.id)), ...(other criteria));
我认为一个不错的查询优化器应该做的简短,但是如果有人对这种方法的效率有任何见识,我将很乐意听到!
问题内容: 我正在尝试使用JPA 2.0创建具有通用关系的多态实体。应该有两个表,一个事件表和一个通知表。在这些表内是彼此相关的具体实体,如下所示: 从逻辑上讲,这应该在休眠状态下是可能的,因为在SQL中是可能的: 这就是我所拥有的: 使用此代码,我可以持久保存并获取任何Event,Notification,LoginEvent或NotificationEvent,但是当我尝试在JPA 2.0元模
我有个问题。当我有其他实体时,我不知道如何创建API。我与邮递员工作,当我做一个请求,以看到所有项目从数据库,我想收到实体也。 例如,这是我的实体:
我使用的是JPA注释,当我在ManyToOne中看到我的实体时,joinColumn总是具有null值。 问题是,当我在字符串中发现一个charge Relations时,这些值被插入到charge Relations表中,但带有product_id的列始终为NULL。 我已经定义了所有的setter和getter。我如何才能强制这使手册插入?谢谢
我有一个通用实体,我想使用JPA持久化,以便它的通用值存储在单个列中。简化的实体类如下所示: 类型唯一标识泛型值的类,并且允许具有相同类的多个类型: 我没有找到如何使用Hibernate保持这种泛型类的方法。我找到了替代方法和变通方法,但它们在我看来并不理想。我考虑了以下选项: > 将值的类型设置为JsonNode,并将其类型类标记为com。弗拉德米尔恰。冬眠类型json。JsonBinaryTy
我有一个使用Spring Data REST和Spring Data JPA的Spring Boot应用程序。我有两个域实体:学生和教室,许多学生可以属于同一个教室。 学生: 教室: 和学生知识库: 课堂知识库: 我有一个SpringApplication主文件,但没有控制器。 教室表中已经有一个房间id为1的教室。当我发出以下请求时http://localhost:8080/students,在
我的问题可能看起来很傻。我是JPA的新手,试图理解它的基本概念。我发现有一种@multi-to-one实体关系可以在那里使用。我的问题是,为什么有人想在拥有“一对多”关系的同时使用它?我的意思是,拥有后一个就足够了解关系并发送查询了,对吗?如果没有,请解释。也许我对这两种关系的看法是完全错误的。请提供一个场景作为示例,以便我更好地理解。谢谢