Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 1078|回复: 0

Spring 和 JPA 组合时 JPA的事务管理

[复制链接]

该用户从未签到

发表于 2011-10-20 10:59:46 | 显示全部楼层 |阅读模式
基于原生的JPA实现DAO
注意
EntityManagerFactory实例是线程安全的, 但EntityManager实例不是。被注入的JPA EntityManager的行为和从应用服务器JNDI环境中获取的没有区别, 和JPA规范定义的一样。如果存在一个被注入的JPA EntityManager, 它会代理对当前事务EntityManager的所有调用; 否则每个操作都会创建一个EntityManager,确保线程安全。(这是最重要的区别,关于 EntityManagerFactory 和 EntityManager 创建 实体对象,从而对以后DAO 或者 DAOImplent 的@Transactional 注解的理解

你完全可以使用原生的JPA的API进行编程而无需对Spring产生任何依赖,这可以通过一个被注入的 EntityManagerFactory 或EntityManager 来完成。 注意Spring能够识别字段或者方法级别的 @PersistenceUnit 和 @PersistenceContext 标注,如果PersistenceAnnotationBeanPostProcessor 功能被激活的话。 一个相应的DAO实现类看上去就像这样:
  1. public class ProductDaoImpl implements ProductDao {
  2.     @PersistenceUnit
  3.     private EntityManagerFactory entityManagerFactory;
  4.     public Collection loadProductsByCategory(String category) {
  5.         EntityManager em = this.entityManagerFactory.getEntityManager();
  6.         try {
  7.              Query query = em.createQuery("from Product as p where p.category = ?1");
  8.              query.setParameter(1, category);
  9.              return query.getResultList();
  10.         }
  11.         finally {
  12.             if (em != null) {
  13.                 em.close();
  14.             }
  15.         }
  16.     }
  17. }
复制代码


上述的DAO不对Spring产生任何依赖,而它就如同使用Spring的 JpaTemplate 那样,非常适合在Spring的application context中进行配置。 此外,这样的DAO可以利用标注来要求 EntityManagerFactory 的注入:
  1. <beans>
  2.   ...
  3.   <!-- JPA annotations bean post processor -->
  4.   <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
  5.   <bean id="myProductDao" class="product.ProductDaoImpl"/>
  6. </beans>
复制代码

这类DAO的主要问题在于每次总是从工厂中获取一个新的 EntityManager 实例。 这一点可以通过对 EntityManager 而不是factory进行注入来解决:
  1. public class ProductDaoImpl implements ProductDao {
  2.     private EntityManager em;
  3.     @PersistenceContext
  4.     public void setEntityManager(EntityManager em) {
  5.         this.em = em;
  6.     }
  7.     public Collection loadProductsByCategory(String category) {
  8.        Query query = em.createQuery("from Product as p where p.category = :category");
  9.        query.setParameter("category", category);
  10.        return query.getResultList();
  11.     }
  12. }
复制代码
回复

使用道具 举报

该用户从未签到

发表于 2011-10-31 11:04:48 | 显示全部楼层
谢谢楼主分享啊。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-11-1 09:02 , Processed in 0.301954 second(s), 33 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表