混合使用JPA和Hibernate

本文介绍了如何在使用JPA时,通过获取Hibernate Session实例来调用更丰富的查询功能。当JPA的标准接口无法满足需求时,可以直接使用Hibernate的session.createSQLQuery()并设置ResultTransformer来将查询结果转换为Map。在EJB容器中需要注意由于上下文不同,获取Session的方式也会有所不同。这种方法允许在JPA项目中利用特定实现(如Hibernate)的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JPA的出现, 统一了逐渐混乱起来的Java ORM产品, 这无疑是件好事情, 包括toplink, hibernate, kodo,openJPA 等几种ORM实现现在都已经兼容支持JPA了.

Hibernate作为一个广为人知的ORM/JPA实现, 是我比较喜欢并熟悉的一个, 因此把Glassfish默认的Toplink替换成了Hibernate.  JPA的persistence操作是通过EntityManager来实现的, 在大部分时候使用JPA的接口就可以完成大多数的数据库操作了, 但是对于一些复杂的情况, JPA的接口毕竟只是Hibernate的一个子集, 使得我必须去使用Hibernate来完成.

比如Hibernate实现里有许多针对查询的优化, 我想把所有查询的结果自动封装成map返回可以使用Hibernate的session.createSQLQuery(sql) .setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP).list(); 以达到简化不同层之间对象传递的目的. 但是在JPA的标准接口里, 并不提供这样的服务, 所以这种情况下必须转而调用Hibernate来进行.

原理是通过entitymanager的实例来得到Hibernate session的实例, 这样就可以进而调用所有hibernate提供的服务了.   具体做法是

.....JPA.....

Session session = (Session) entityManager.getDelegate();   //get  an instance of hibernate session

....Hibernate.....

list = session
     .createSQLQuery("select code, name from org_employee")
     .setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP).list();

上端代码在JUnit下测试通过, 需要注意的是

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值