JPA @PersistenceContext及@Transactional Annotation

2011-05-17 09:25  9521人阅读  评论(1)  收藏  举报
jpa class bean 存储 java 数据库

JPA(Java Persistence API )也就是java储存数据API,提供了更为便捷的存储数据的接口,当然在进行一些复杂及查询操作时需要使用Java Persistence query language,这个和sql基本一样,只是需要遵循另一些语法规则,可以参考http://download.oracle.com/javaee/5/tutorial/doc/bnbuf.html 。

在使用JPA时,比如你的MySql中有定义了一个Lesson表格,现在想对Lesson表格进行添加一个记录,这时候你需要写的代码主要有两个:

1、写一个Lesson.java,就是一个pojo啦,一个简单的java对象,里面包括了数据库中Lesson表格的所有字段,这里见Lesson.java中的属性名称同数据库的名称保存一致便ok了。然后再User.java类定义前面加上@Entity这个annotation,这样子相当标注了这个Lesson.java类将作为存储时的一个实体来对待。

2、写一个存储接口,比如LessonServiceImpl.java,这个类里面需要有一个javax.persistence.EntityManager类的属性,比如命名为em,这样相应的数据操作就可以通过这个em来实现,比如要添加一天记录,只需要调用em.persist。更新时em.merge,删除时em.remove。JPA考虑到这些通常的应用因此设计了这些简单的接口方便操作。下面是该类的部分代码

@Transactional
public class LessonServiceImpl implements LessonService {
    private EntityManager em;
    
    @PersistenceContext
    public void SetEntityManager(EntityManager em)
    {        
        this.em = em;
    }

public void remove(int id) {
        // TODO Auto-generated method stub
        Lesson lesson = em.find(Lesson.class, id);
        if(lesson != null)
        {
            em.remove(lesson);
        }
    }

.............

当然需要注意到的是存储的接口LessonServiceImpl.java在设计的时候通常是作为singleton的类型,因此通常是在类工厂里面将来。而且通常LessonServiceImpl.java中的那个EntityManager对象是通过依赖注入的方式在类工厂中直接设置。比如下面的代码spring factory中的例子

................

<bean id="LessonService" class="quickstart.service.LessonServiceImpl" />

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        .......................

</bean>

<bean id="transactionManager"
        class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />

...................

这里使用的不是纯粹的JPA,而是使用hibernate-jpa-2.0-api-1.0.0.Final.jar中的JPA。对LessonServiceImpl.java这个类的定义前加入@Transactional,表示这个类需要进行事务管理,而使用的事务则是通过<tx:annotation-driven />来指定的,也就是LessonServiceImpl要通过这个类工厂中定义的transactionManager来进行数据的操作时的事务处理,可以参考http://static.springsource.org/spring/docs/2.0.x/reference/transaction.html#transaction-declarative 。

定义一个set函数这个函数传递进一个EntityManager的类参数,通过这个接口类工厂才可以将LessonServiceImpl需要EntityManager由类工厂中注入进去,然后这个set函数需要加上@PersistentContext这个annotation,表示这个就是注入存储上下文对象的接口,可以参考http://download.oracle.com/javaee/5/tutorial/doc/bnbqw.html 。

当然另外我想最简单清楚表现JPA使用的方法可能是这样,采取直接注入的方式:

<bean id="LessonService" class="quickstart.service.LessonServiceImpl" >

<property name="entityManager" ref="entityManager"/>

</bean>

但是这样一个问题就是所有的访问数据的接口都要注入一次。所以这里通过AOP的方法及结合annotation的方法(常用的是xml方式)来进行依赖注入。对于事务处理通过@Transactional来实现的,所以这里如果去掉@Transactional则相当于去掉事务管理,会导致只能对数据进行查询操作无法删除或更新;而对于管理entity则通过@PersistentContext,这里类工厂会把名称为entityManagerFactory(默认名称)的bean传递给所有工厂中的bean有添加@PersistentContext的接口(这里是LessonService)

JPA @PersistenceContext及@Transactional Annotation相关推荐

  1. JPA @PersistenceContext和@Transactional Annotation

    JPA(Java Persistence API )也就是说,java存储数据API,它提供的接口更方便的存储数据,当然,经过一些复杂的,并需要使用查询操作Java Persistence query ...

  2. Spring @transactional annotation 事务使用详解

    来源:http://www.yihaomen.com/article/java/412.htm annotation 方式写程序越来越称谓主流了,以前用hibernate 也用 xml 一大堆配置文件 ...

  3. How does Spring @Transactional Really Work?--转

    原文地址:http://blog.jhades.org/how-does-spring-transactional-really-work/ In this post we will do a dee ...

  4. Spring ORM示例 - JPA,Hibernate,Transaction

    Spring ORM示例 - JPA,Hibernate,Transaction 欢迎来到Spring ORM示例教程.今天我们将使用Hibernate JPA事务管理来研究Spring ORM示例. ...

  5. primefaces教程_Primefaces,带有JPA的Spring 4(Hibernate 4 / EclipseLink)示例教程

    primefaces教程 Java Persistence API is a standard specification. It provides a persistence model that' ...

  6. orm jpa_Spring ORM示例– JPA,Hibernate,事务

    orm jpa Welcome to the Spring ORM Example Tutorial. Today we will look into Spring ORM example using ...

  7. Hibernate与JPA

    本章首先给大家介绍持久化,ORM与DAO三个概念,以及它们之间的关系. 1.1持久化,DAO与ORM 介绍持久化,DAO与ORM三个概念,以及它们之间的关系. 1.1.1 持久化 数据在计算机中有两种 ...

  8. Spring Data JPA的持久层

    1.概述 本文将重点介绍Spring 3.1,JPA和Spring Data的持久层的配置和实现. 有关使用基于Java的配置和项目的基本Maven pom设置Spring上下文的分步介绍,请参阅本文 ...

  9. 关于Spring的事务Transactional,锁同步,并发线程

    Spring事务传播机制和数据库隔离级别 在标准SQL规范中定义了4个事务隔离级别,不同隔离级别对事务处理不同 . 未授权读取(Read Uncommitted): 也称 未提交读.允许脏读取但不允许 ...

最新文章

  1. 【题解】 CF718C Sasha and Array
  2. iptables防火墙设置实例
  3. numpy批量iou
  4. 网络优化常见专业术语详解
  5. opening tables mysql_MySQL 大量 Opening tables 案例分析-爱可生
  6. 摇杆控制方向原理_医用无油空压机的送料作用及工作原理
  7. mysql变量string_mysql sql语句有变量 time_t变量转换为string
  8. 广东第一高中生_曝前广东第一高中生将加盟广东,他或成宏远最有希望之人
  9. 分布式存储系统设计的关键问题
  10. 产品经理常用的分析模型方法
  11. android模拟器横屏显示,安卓模拟器bluestacks怎么横屏显示
  12. InnoDB一棵B+树能存多少行数据?为什么要用B+树?而不是其他树?
  13. 淘宝双11大数据分析(Spark 分析篇)
  14. 干货来啦!「敏捷开发畅想与实战」沙龙回顾
  15. python怎么取百位_#python计算结果百位500向下取整,(0-499取000,500-999取500)
  16. 简体中文与繁体中文互转
  17. 2016搜狗校招编程题
  18. C语言实现raw格式图像的读入和存取
  19. 华为认证专用模拟器 企业内部业务网络设计
  20. 《网络安全法》内容以及解读

热门文章

  1. iamp是什么意思计算机网络,IAMP是什么意思
  2. 加速汽车行业转型,云计算到底扮演了什么角色?
  3. Windows下安装PyQt(python3.8+PyQt5)
  4. 微信小程序之实现地图定位(使用腾讯位置服务插件)
  5. 用胶带“粘”出的诺贝尔奖
  6. 在Python中如何保存图像
  7. KVM-Virsh指令详解
  8. 解决npm 编译时报node_modules/optipng-bin/vendor/optipng ENOENT
  9. win10开机“正在准备自动修复”,且无法修复你的电脑
  10. python改word域_python修改word