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)

时间: 2024-08-24 21:09:24

JPA @PersistenceContext和@Transactional Annotation的相关文章

【Spring】@Transactional解释 (转)

Spring是当今广泛使用的框架,为Java核心堆栈带来了许多强大的功能和扩展.然而,大多数人倾向于使用这些功能,而不了解其潜在的机制. 由于现实生活中没有"魔法",我们将在这一系列文章中深入研究与事务和数据库相关的一些Spring功能. 第一篇文章是处理着名的@Transactional注释,为开发者节省了管理低级别事务代码的负担. 第二篇文章可以在这里:Spring @ PersistenceContext / @ PersistenceUnit解释 注意:以下代码分析使用Spri

ORM JPA

8.4  集成JPA JPA全称为Java持久性API(Java Persistence API),JPA是Java EE 5标准之一,是一个ORM规范,由厂商来实现该规范,目前有Hibernate.OpenJPA.TopLink.EclipseJPA等实现. 8.4.1  如何集成 Spring目前提供集成Hibernate.OpenJPA.TopLink.EclipseJPA四个JPA标准实现. Spring通过使用如下Bean进行集成JPA(EntityManagerFactory): L

Spring Data JPA Batch Insertion

转自:https://www.jeejava.com/spring-data-jpa-batch-insertion/ Spring Data JPA Batch Insertion will show you how we can insert a large dataset into a database at once using Spring Data JPA. For this tutorial we will create a Spring Boot project in Eclip

Spring @Transactional原理

今天想用一下Spring的Transaction Manager,但中间遇到一个问题,但文档上讲得不是很清楚,于是乎只得自己去扒代码来看了. 首先从配置入手,启用Spring的TransactionManagement需要在Configuration Bean上加上@EnableTransactionManagement注解,或者在XML配置文件中加上<tx:annotation-driver />元素来启用事务支持,这样我们将会在Spring Context里面注册事务支持所需要的组件,比如

对ORM的支持 之 8.4 集成JPA ——跟我学spring3

8.4  集成JPA JPA全称为Java持久性API(Java Persistence API),JPA是Java EE 5标准之一,是一个ORM规范,由厂商来实现该规范,目前有Hibernate.OpenJPA.TopLink.EclipseJPA等实现. 8.4.1  如何集成 Spring目前提供集成Hibernate.OpenJPA.TopLink.EclipseJPA四个JPA标准实现. Spring通过使用如下Bean进行集成JPA(EntityManagerFactory): L

JPA与EJB3的关系

JPA是基于Java持久化的解决方案,主要是为了解决ORM框架的差异,它的出现在某种程度上能够解决目前ORM框架之间不能够兼容的问题,对开发人员来说,能够更好的在JPA规范下进行系统开发. JPA全称为Java Persistence API ,Java持久化API是Sun公司在Java EE 5规范中提出的Java持久化接口.JPA吸取了目前Java持久化技术的优点,旨在规范.简化Java对象的持久化工作. 如图1.3说明了JPA在系统架构中的作用,使用JPA持久化对象,而不是依赖于某一个OR

Hibernate 零配置之Annotation注解

JPA规范推荐使用Annotation来管理实体类与数据表之间的映射关系,从而避免同时维护两份文件(Java 实体类 和 XML 映射文件),将映射信息(写在Annotation中)与实体类集中在一起. 以下我将使用eclipse来构建一个简单使用注解取代*.hbm.xml的查询小例子.(p.s 建议不要使用Myeclipse,他很方便但是对于初学者来说没有eclipse学得牢靠) 1.在数据库中构建一张表 2.生成相应的hibernate.cfg.xml文件 <?xml version="

持久化API(JPA)系列(二)实体入门

上一篇文中我们讲述了<持久化API(JPA)系列(一)实体简介> JPA实现的作用就是:把对实体的操作,转换成对数据库的操作.这样应用程序就能以面向对象的方式操作实体,而JPA实现则负责转换成对应的SQL(结构化查询语言)操作. JPA只是一种规范!并不是任何具体的ORM框架!当在程序中使用JPA进行持久化时,底层一定需要具体的ORM框架作为实现. 本文核心: 接下来我们先介绍一个入门级的JPA实例,通过这个实例读者可以感受到JPA的简单.易用性. 您会发现JPA执行持久化操作和使用Hiber

EJB之JPA

在前一篇文章中大概了解了EJB是什么?那么接下来就进一步介绍一下它与JPA有什么样的关系?及什么是JPA?JPA怎样用? 一.是什么? 第一次听说JPA是在EJB视屏中,所以一直感觉他们有不解的渊源.可是经过这一段时间学习和总结发现JPA的作用远远不局限于此. JPA是这样定义的:JPA(Java Persistence API)是Sun官方提出的Java持久化规范.为Java开发者提供了一种对象/关系映射工具来管理Java应用中的关系数据.它的出现主要是为了简化现有的持久化开发工作和整合ORM