混合使用JPA和Hibernate
来源:互联网 发布:广告美工行业发展前景 编辑:程序博客网 时间:2024/05/22 14:39
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下测试通过, 需要注意的是在ejb容器里测试的时候抛出了一个classcast例外, 经过debug得知,在容器模式下, entitymaager返回的delegate是不同的, 因此,需要区分具体情况.
完整的实现如下:
List list = null;
try {
EntityManager entityManager = beginTransaction();
String ql = filter.generateSearchQuery();
// Query query = entityManager.createQuery(ql);
Session session = null;
if (!this.isManaged()) {
session = (Session) entityManager.getDelegate();
} else {
EntityManagerImpl hibernateImpl = (EntityManagerImpl) entityManager
.getDelegate();
session = hibernateImpl.getSession();
}
list = session
.createSQLQuery("select code, name from org_employee")
.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP).list();
// PageInfo pageInfo = filter.getPageInfo();
// if(pageInfo != null){
// query.setFirstResult(pageInfo.getFirstResultIndex());
// query.setMaxResults(pageInfo.getPageSize());
// }
// list = query.getResultList();
commit();
} catch (Exception e) {
rollback();
throw new ServiceException(e);
}
return list;
以上代码在容器模式和pojo模式下同时测试通过.
同样的道理, 如果你用的不是Hibernate, 用的是其他的JPA实现, 同样可以通过相同的方法达到在JPA里调用implementation particular的服务的目的.
[原创文章, 禁止转载]
- 混合使用JPA和Hibernate
- JPA事务和hibernate混合事务研究<一>
- JPA 和hibernate-jpa-api
- 使用JPA的@SecondaryTable来实现hibernate的混合使用“每个类分层结构一张表”和“每个子类一张表”的功能
- jpa入门(使用hibernate)
- hibernate-使用data jpa
- JPA和Hibernate注解
- hibernate 和jpa
- Jpa和Hibernate
- JPA和Hibernate浅析
- jpa和hibernate
- JPA和hibernate关系
- hibernate和jpa注意
- jpa 和hibernate 关系
- 原生Hibernate和Jpa Hibernate
- Hibernate、jpa 的dynamic-insert和dynamic-update的使用
- 使用JPA和Hibernate进行批量处理的最佳方式
- spring data jpa和hibernate jpa
- 用户登录函数
- 地方站的網吧推廣(轉)
- 计算机基础知识
- 陈皓谈程序员升级(下):给新人程序员的八点建议(转载)
- SOA 概述
- 混合使用JPA和Hibernate
- JAVASCRIPT技巧集合
- 嵌入式系统 Boot Loader 技术内幕
- 正整数,纯数字判断函数
- 2007年搜索引擎市场报告
- windows消息大全
- 向DataSet中追加列
- 神州数码笔试题目
- 内存的作用