Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
来自Hibernate会话的JPA风格标准/标准生成器查询_Hibernate_Jpa_Criteria Api - Fatal编程技术网

来自Hibernate会话的JPA风格标准/标准生成器查询

来自Hibernate会话的JPA风格标准/标准生成器查询,hibernate,jpa,criteria-api,Hibernate,Jpa,Criteria Api,我有一个使用Hibernate 4.x的应用程序,它目前正在使用本机Hibernate API(这意味着我有一个SessionFactory和Sessions)。我只是想指出,现有的Criteria API已被弃用,取而代之的是JPA(高级)Criteria API: Hibernate提供了一个旧的、遗留的org.Hibernate.CriteriaAPI,应该认为它已被弃用。任何功能开发都不会以这些API为目标。最终,特定于Hibernate的criteria特性将作为JPAjavax.pe

我有一个使用Hibernate 4.x的应用程序,它目前正在使用本机Hibernate API(这意味着我有一个
SessionFactory
Session
s)。我只是想指出,现有的Criteria API已被弃用,取而代之的是JPA(高级)Criteria API:

Hibernate提供了一个旧的、遗留的
org.Hibernate.Criteria
API,应该认为它已被弃用。任何功能开发都不会以这些API为目标。最终,特定于Hibernate的criteria特性将作为JPA
javax.persistence.criteria.CriteriaQuery
的扩展进行移植

我不想将我的应用程序转换为直接使用
EntityManager
(即使从那里很容易获得Hibernate
会话),因为我们有大量需要替换的自定义Hibernate配置逻辑。尽管如此,我还是希望开始使用JPA标准API,因为旧的API已经被弃用了(如果过去的Hibernate版本有任何迹象的话,它们可能会在将来的某个随机点消失),而且它们还提供了更好的类型安全性


如果我使用的是SessionFactory/Session,如何使用新的CriteriaQuery/CriteriaBuilder API?

我们在项目中遇到了同样的难题。 这个项目非常复杂:90%的实体是动态生成的;实现的API级别高于Hibernate标准API、重DAO和服务层,使用非常广泛;我们的hibernate版本经过多次修补,以支持特定的功能(如
/
开始,通过
连接,
数组
在oracle中键入等);postgresql和oracle两者都使用,或者等等

新的jpaapi将对我们非常有用。我们需要能够在标准API(而不是HQL)级别使用函数(例如出于某种性能原因,
NVL/coalesce
substring
trim
等等)。 此外,我们需要Hibernate Envers,它仅可用于“
EntityManager
”JPA实现

不幸的是,根据我们的研究结果,根本无法使用来自本机Hibernate的JPA标准API。也不能使用enver。 Hibernate项目正在不断发展并获得新特性。 迁移到新的hibernate版本对我们来说是一项非常复杂的任务。我们非常担心在迁移后无法使用新版本的许多新特性,并且无法使用这个基本框架进行增长

因此,我们考虑两种可能的方式:使用<代码> SQLType < /C> >自己实现<代码>表达式<代码> s(解析代码名>标准>标准>代码>转换为SQL)或迁移到“<代码> EntItMeals< /Calp>”/<代码> CriteriaBuilder < /代码>。第二条路看起来是不可避免的。但是迁移到JPA实现带来了许多隐藏的问题,这些问题破坏了我们的项目


如果我们选择迁移,并且它会很有用,那么我将在这里留下我们在这项活动中将要解决的问题。

您目前的会话情况如何?它在中心位置吗?如果是这样的话,您应该能够更改它,以便从EntityManager获取会话,这样您就可以访问EM。问题是会话由EntityManager使用,而不是相反。但是如果你让你的高层使用EntityManager,并从中获取会话(这样你就不会破坏旧代码),你会更好。它位于代码的中心部分,但我部分担心的是,我们有一个相当复杂的配置系统来获取Hibernate(编程)配置,我不确定我是否可以用JPA复制。如果Hibernate的标准被弃用而支持JPA的标准,但是无法从Hibernate API访问它,我会预料到他们也会弃用Hibernate配置API(相反,看起来他们正在继续大量构建Hibernate配置API)是的,但您似乎无法以这种方式混合和匹配JPA和Hibernate。即使在没有EntityManager的情况下获得CriteriaQuery实例,也需要EM来执行查询。