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@Modifying需要@Transactional注解
在JPA开发中遇到一个很奇怪的问题,@Modifying需要和@Transactional配合使用才能正常使用.如下面代码所示 @Modifying @Transactional @Query(&qu ...
- How does Spring @Transactional Really Work?--转
原文地址:http://blog.jhades.org/how-does-spring-transactional-really-work/ In this post we will do a dee ...
- 摘抄JPA官方文档原文 防呆
Spring Data JPA - Reference Documentation Oliver GierkeThomas DarimontChristoph StroblMark PaluchVer ...
- Spring Data JPA Batch Insertion
转自:https://www.jeejava.com/spring-data-jpa-batch-insertion/ Spring Data JPA Batch Insertion will sho ...
- Spring 下默认事务机制中@Transactional 无效的原因
Spring中 @Transactional 注解的限制1. 同一个类中, 一个nan-transactional的方法去调用transactional的方法, 事务会失效 If you use (d ...
- Spring与JPA
Java持久化API(Java Persistence API),即JPA Spring中使用JPA的第一步是要在Spring应用上下文中将实体管理器工厂(entity manager factory ...
- Java JPA @Transient 在Hibernate中应用
jpa @Transient - 走过程序员的路 - CSDN博客https://blog.csdn.net/lafengwnagzi/article/details/55511066 Hiberna ...
- EJB3与JPA的关系
转载自http://www.cnblogs.com/o-andy-o/archive/2012/04/17/2453537.html JPA是基于Java持久化的解决方案,主要是为了解决ORM框架的差 ...
- JPA与EJB3的关系
JPA是基于Java持久化的解决方案,主要是为了解决ORM框架的差异,它的出现在某种程度上能够解决目前ORM框架之间不能够兼容的问题,对开发人员来说,能够更好的在JPA规范下进行系统开发. JPA全称 ...
随机推荐
- Effective C++ 24,25
24.在函数重载和设定參数缺省值间要谨慎选择. 获得一种类型的数据的最小值或最大值,对于c中,一般使用在<linits.h>中定义的各种宏如INT_MIN 来进行表示,可是这样无法进行泛型 ...
- ibatis新手入门
ibatis 是什么 iBATIS是以SQL为中心的持久化层框架. 能支持懒载入.关联查询.继承等特性. iBATIS不同于一般的OR映射框架. OR映射框架,将数据库表.字段等映射到类.属性,那是一 ...
- struts 2吊牌s:if 、s:iterator注意
疏忽,也没有相应的总结.实际上JSTL标签Struts2标签混淆.导致一些上述问题的细节.今天我给从下一个总结,同 后不要再犯这种错误. 总喜欢在s:if标签里面使用$,导致各种数据读不出来. str ...
- hadoop 磁盘限额配置
配置方法: 在 hdfs-site.xml 里配置如下参数,注意,那个 value 的值是配置该磁盘保留的DFS不能使用的空间大小,单位是字节. (如果多块硬盘,则表示为每块硬盘保留这么多空间) &l ...
- web desktop在线演示
http://mydesk.sinaapp.com 基于extjs的web desktop应用框架. 1.跨浏览器 2.动态载入所需css,js文件 3.权限管理 4.支持多语种 5.支持asp,js ...
- ACM-最小生成树之畅通project——hdu1863
***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...
- [docker]coreOS与atomic对照
声明: 本博客欢迎转发,但请保留原作者信息! 博客地址:http://blog.csdn.net/halcyonbaby 内容系本人学习.研究和总结,如有雷同,实属荣幸! 摘自https://majo ...
- OCP读书笔记(10) - 使用闪回技术I
使用闪回技术查询数据 闪回查询:就是查询表在过去某个时间点的数据,所用到的技术就是undo数据 SQL> conn scott/tiger 创建测试表 SQL> create table ...
- 119 - Greedy Gift Givers
Greedy Gift Givers The Problem This problem involves determining, for a group of gift-giving frien ...
- c++中sort()及qsort()的使用方法总结
当并算法具体解释请见点我 想起来自己天天排序排序,冒泡啊,二分查找啊,结果在STL中就自带了排序函数sort,qsort,总算把自己解脱了~ 所以自己总结了一下,首先看sort函数见下表: 函数名 ...