我们是一个spring-data-jpa应用程序,我们在应用程序启动期间面临查询验证问题。
我们使用 spring-data-jpa 1.3 版本。
由于用例,我们对域模型进行了重组,如下所示。
我们有一个实体' AnEntity'在重组后,我们制作了“AnEntity'作为一个抽象类(不是任何映射的超类)并引入了2个子实体' B_Entity'和' C_Entity'。但是,对于对我们的应用程序的影响最小,我们没有触及系统中定义的任何命名查询或应用程序逻辑。我们的用例需要对用户请求实体的方式进行一些运行时更改。 (例如:用户仍然要求' AnEntity'但是在运行时我们决定是否返回' B_Entity' C_Entity')。我们使用自定义RepositoryFactory实现,我们有自己的EntityManager和相关JPA类代理,这将有助于拦截JPA调用(查询执行通过我们的代理)。
因此,在应用程序启动时,为了避免验证错误,一个命名查询定义为'从AnEntity'中选择一个。将被转换为'从A_Entity'中选择一个(通过自定义存储库实现和代理类)并保存在内存中。然后根据用户请求,我们决定是否在运行时返回A_Entity或B_Entity。
现在我们决定升级到 spring-data-jpa 1.10.1 。但不幸的是,org.springframework.data.jpa.repository.query.SimpleJPAQuery进行了一次新的验证,它采用了一个新的EntityManager,而不是使用已经传递的EntityManager(它是我们代理的一个实例)。因此我们丢失了拦截查询的句柄,验证失败,应用程序也失败了。
我们已经看到显式EntityManager的引入归因于https://jira.spring.io/browse/DATAJPA-350。
无论如何我们可以绕过这个验证吗?我们现在唯一可以看到的方法是为EntityManagerFactory创建一个代理,但它可能会创建许多不需要的对象,我们担心它会带来我们可能无法恢复的不必要的复杂性。
现在我们陷入困境,感谢任何帮助。