JPA @PersistenceContext及@Transactional Annotation
JPA @PersistenceContext及@Transactional Annotation
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相关推荐
- JPA @PersistenceContext和@Transactional Annotation
JPA(Java Persistence API )也就是说,java存储数据API,它提供的接口更方便的存储数据,当然,经过一些复杂的,并需要使用查询操作Java Persistence query ...
- Spring @transactional annotation 事务使用详解
来源:http://www.yihaomen.com/article/java/412.htm annotation 方式写程序越来越称谓主流了,以前用hibernate 也用 xml 一大堆配置文件 ...
- How does Spring @Transactional Really Work?--转
原文地址:http://blog.jhades.org/how-does-spring-transactional-really-work/ In this post we will do a dee ...
- Spring ORM示例 - JPA,Hibernate,Transaction
Spring ORM示例 - JPA,Hibernate,Transaction 欢迎来到Spring ORM示例教程.今天我们将使用Hibernate JPA事务管理来研究Spring ORM示例. ...
- primefaces教程_Primefaces,带有JPA的Spring 4(Hibernate 4 / EclipseLink)示例教程
primefaces教程 Java Persistence API is a standard specification. It provides a persistence model that' ...
- orm jpa_Spring ORM示例– JPA,Hibernate,事务
orm jpa Welcome to the Spring ORM Example Tutorial. Today we will look into Spring ORM example using ...
- Hibernate与JPA
本章首先给大家介绍持久化,ORM与DAO三个概念,以及它们之间的关系. 1.1持久化,DAO与ORM 介绍持久化,DAO与ORM三个概念,以及它们之间的关系. 1.1.1 持久化 数据在计算机中有两种 ...
- Spring Data JPA的持久层
1.概述 本文将重点介绍Spring 3.1,JPA和Spring Data的持久层的配置和实现. 有关使用基于Java的配置和项目的基本Maven pom设置Spring上下文的分步介绍,请参阅本文 ...
- 关于Spring的事务Transactional,锁同步,并发线程
Spring事务传播机制和数据库隔离级别 在标准SQL规范中定义了4个事务隔离级别,不同隔离级别对事务处理不同 . 未授权读取(Read Uncommitted): 也称 未提交读.允许脏读取但不允许 ...
最新文章
- 【题解】 CF718C Sasha and Array
- iptables防火墙设置实例
- numpy批量iou
- 网络优化常见专业术语详解
- opening tables mysql_MySQL 大量 Opening tables 案例分析-爱可生
- 摇杆控制方向原理_医用无油空压机的送料作用及工作原理
- mysql变量string_mysql sql语句有变量 time_t变量转换为string
- 广东第一高中生_曝前广东第一高中生将加盟广东,他或成宏远最有希望之人
- 分布式存储系统设计的关键问题
- 产品经理常用的分析模型方法
- android模拟器横屏显示,安卓模拟器bluestacks怎么横屏显示
- InnoDB一棵B+树能存多少行数据?为什么要用B+树?而不是其他树?
- 淘宝双11大数据分析(Spark 分析篇)
- 干货来啦!「敏捷开发畅想与实战」沙龙回顾
- python怎么取百位_#python计算结果百位500向下取整,(0-499取000,500-999取500)
- 简体中文与繁体中文互转
- 2016搜狗校招编程题
- C语言实现raw格式图像的读入和存取
- 华为认证专用模拟器 企业内部业务网络设计
- 《网络安全法》内容以及解读
热门文章
- iamp是什么意思计算机网络,IAMP是什么意思
- 加速汽车行业转型,云计算到底扮演了什么角色?
- Windows下安装PyQt(python3.8+PyQt5)
- 微信小程序之实现地图定位(使用腾讯位置服务插件)
- 用胶带“粘”出的诺贝尔奖
- 在Python中如何保存图像
- KVM-Virsh指令详解
- 解决npm 编译时报node_modules/optipng-bin/vendor/optipng ENOENT
- win10开机“正在准备自动修复”,且无法修复你的电脑
- python改word域_python修改word