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@Modifying需要@Transactional注解

    在JPA开发中遇到一个很奇怪的问题,@Modifying需要和@Transactional配合使用才能正常使用.如下面代码所示 @Modifying @Transactional @Query(&qu ...

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

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

  3. 摘抄JPA官方文档原文 防呆

    Spring Data JPA - Reference Documentation Oliver GierkeThomas DarimontChristoph StroblMark PaluchVer ...

  4. Spring Data JPA Batch Insertion

    转自:https://www.jeejava.com/spring-data-jpa-batch-insertion/ Spring Data JPA Batch Insertion will sho ...

  5. Spring 下默认事务机制中@Transactional 无效的原因

    Spring中 @Transactional 注解的限制1. 同一个类中, 一个nan-transactional的方法去调用transactional的方法, 事务会失效 If you use (d ...

  6. Spring与JPA

    Java持久化API(Java Persistence API),即JPA Spring中使用JPA的第一步是要在Spring应用上下文中将实体管理器工厂(entity manager factory ...

  7. Java JPA @Transient 在Hibernate中应用

    jpa @Transient - 走过程序员的路 - CSDN博客https://blog.csdn.net/lafengwnagzi/article/details/55511066 Hiberna ...

  8. EJB3与JPA的关系

    转载自http://www.cnblogs.com/o-andy-o/archive/2012/04/17/2453537.html JPA是基于Java持久化的解决方案,主要是为了解决ORM框架的差 ...

  9. JPA与EJB3的关系

    JPA是基于Java持久化的解决方案,主要是为了解决ORM框架的差异,它的出现在某种程度上能够解决目前ORM框架之间不能够兼容的问题,对开发人员来说,能够更好的在JPA规范下进行系统开发. JPA全称 ...

随机推荐

  1. 同事的Excel中的图片突然不能选择

    今天上午,同事突然说自己用的Excel不能编辑了,发来一看原来是其中做的图片不能编辑,鼠标放上去后显示个圆圈选不中. 在“视图”中调出“控件工具箱”工具栏,上面有一个三角板与直尺样子的按钮叫“设计模式 ...

  2. 纯JS实现的3D标签云,不依赖不论什么第三方库,支持移动页面

    <span style="font-family: Arial, Helvetica, sans-serif;"><!DOCTYPE html PUBLIC &q ...

  3. 动态创建按钮的JS

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML>  <HEA ...

  4. hdu 2842 Chinese Rings

    点击打开hdu2842 思路: 矩阵快速幂 分析: 1 题目的意思是给定n个环,和一些规则要把所有的环全部拆下最少需要的步数 2 题目规定如果要拆第n个环,那么第n-1个要挂着,n-2环要被拆下.那么 ...

  5. UVALive 5790 Ball Stacking 解题报告

    比赛总结 题目 题意: 有n层堆成金字塔状的球,若你要选一个球,你必须把它上面那两个球取了,当然也可以一个不取.求选的球最大的权值和. 题解: 将这堆球转成举行,第一行是(0,0),第二个是(1,0) ...

  6. Linux pipe功能

    1. 功能说明 pipe(管道建设): 1) 头 #include<unistd.h> 2) 定义函数: int pipe(int filedes[2]); 3) 函数说明: pipe() ...

  7. OCP读书笔记(14) - 管理数据库性能

    搜集统计信息 1. dbms_stats gather_schema_stats 1)option:有四个选项: a.gather empty:只分析目前还没有搜集过统计信息的表 SQL> co ...

  8. Kendo UI开发教程(14): Kendo MVVM 数据绑定(三) Click

    Click绑定可以把由ViewModel定义的方法不绑定到目标DOM的click事件.当点击目标DOM元素时触发ViewModel的对应方法.例如: 使用Click绑定 1 <div id=&q ...

  9. Java时间比較

    Date类有两个方法 一个是after()比方date1.after(date2)推断date1是否在date2之后也就是说date1小于date2吧, 一个是before()比方date1.befo ...

  10. Urban Dictionary: psd

    Urban Dictionary: psd psd Share on twitter Share on facebook Share on more 3 up, 1 down It means Poo ...