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 @PersistenceContext及@Transactional Annotation 2011-05-17 09:25 9521人阅读 评论(1) 收藏 举报 jpa class ...
- 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): 也称 未提交读.允许脏读取但不允许 ...
最新文章
- 一个 SAP 开发工程师十余年的技术写作之路回顾
- vue prop不同数据类型(数组,对象..)设置默认值
- 图片识别出处_AI人脸识别
- 72 include动作和指令的区别
- 80后偷偷“变老”的20种表现
- 机器学习-吴恩达-笔记-12-推荐系统
- 无法执行任何java命令,报错OutOfMemoryError: Cannot create GC thread. Out of system resources
- 哈希革新Transformer:这篇ICLR高分论文让一块GPU处理64K长度序列
- 锂电池充电芯片,30款设计免费开源
- 网络编程三剑客之sed
- C/C++程序员是什么让你有如此优势?音视频开发该怎么学?
- spry使用视频_Spry Fox如何利用Cloud Build
- C++结课大作业——职工管理系统
- unity如何改变重力方向
- 4、判断一个年份是否为闰年。(闰年即满足以下两条件的年份:其一:能被4整除但不能被100整除;其二:能被400带除)
- [小说]魔王冢(52)赵四爷
- Day31.只出现一次的数字
- Baxter手臂控制
- B2C电子商务网站运营推广的优化技巧
- git 推送出现 quot;fatal: The remote end hung up unexpectedlyquot; 解决方案