`
a137268431
  • 浏览: 157792 次
文章分类
社区版块
存档分类
最新评论

JPA @PersistenceContext及@Transactional Annotation

 
阅读更多

JPA(JavaPersistence 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)

分享到:
评论

相关推荐

    后端 Java Spring Data Jpa @Transactional 介绍

    在Java后端开发中,Spring框架提供了强大的事务管理能力,特别是在使用Spring Data JPA时,`@Transactional`注解使得事务处理变得简单易用。这个注解是Spring框架中的核心部分,它允许开发者声明性地控制事务边界,...

    spring data jpa 动态更新@DynamicUpdate

    在Java世界中,Spring Data JPA是一个非常流行的框架,它为开发者提供了与关系数据库交互的便利,通过简化JPA(Java Persistence API)的使用。在处理大量数据时,提高性能和效率是至关重要的,这就是`@...

    Hibernate JPA

    ### Hibernate JPA 知识点详解 #### 一、Hibernate JPA 概述 **Hibernate**作为当前最为流行的对象关系映射(Object Relational Mapping, ORM)框架之一,在Java开发领域占据着举足轻重的地位。它最早实现了**Java...

    JPA注解@Access实例

    **JPA注解@Access详解** Java Persistence API (JPA) 是Java中用于对象关系映射(ORM)的标准框架,它允许开发人员将Java类与数据库表进行映射,从而简化数据操作。在JPA中,`@Access`注解是用于指定实体属性访问...

    Spring @Transactional工作原理详解

    下面我们将深入探讨`@Transactional`的工作原理,以及其与JPA、持久化上下文(Persistence Context)和数据库事务的关系。 首先,`@Transactional`的使用简化了事务管理。当在方法上标注`@Transactional`时,Spring...

    springboot+jpa+mysql+logs+transactional框架

    在idea下搭建springboot+jpa+mysql+logs+transactional框架 具体内容 请参考项目代码 后续还会增加springcloud的相关内容 都是基于springboot框架的

    在JPA的@Query注解中使用limit条件(详解)

    JPA @Query 注解中使用 Limit 条件详解 在 Java 持久层 API(JPA)中使用 @Query 注解时,需要注意 Limit 条件的使用。在本文中,我们将详细介绍如何在 JPA 的 @Query 注解中使用 Limit 条件。 Limit 条件的使用 ...

    使用JPA中@Query 注解实现update 操作方法(必看)

    总的来说,通过这种方式,我们可以使用JPA和`@Query`注解方便地执行数据库更新操作,同时利用`@Modifying`和`@Transactional`注解来管理事务和数据一致性。这种方法提供了更高的灵活性,允许开发者根据需求定制查询...

    Spring MVC+JPA+Jquery+Flexigrid修改简单示例

    使用`@Repository`接口和`@Transactional`注解实现数据访问层。 3. **Jquery 前端交互** Jquery简化了DOM操作,使得我们可以轻松地处理用户事件、动态更新页面内容。在这个示例中,可能用到了`$.ajax()`方法来异步...

    JPA-2 基本注解

    **JPA(Java Persistence API)**是Java平台上的一个标准,用于管理关系数据库中的对象-关系映射(ORM)。它提供了方便的API和工具来处理持久化操作,使得开发人员可以更加专注于业务逻辑,而不是底层数据库操作。在...

    JPA Annotation Reference

    JPA Annotation Reference

    使用Spring Data Jpa为我们提供的@EntityGraph.docx

    在Spring Data JPA中,当我们处理复杂的数据查询时,可能会遇到N+1查询问题,即在获取一个实体及其关联对象时,数据库会执行多次查询,每次查询一个关联对象。为了解决这个问题,JPA提供了@EntityGraph注解,配合...

    spring+jpa

    其次,Spring 实现了部分在 EJB 容器环境下才具有的功能,比如对 @PersistenceContext、@PersistenceUnit 的容器注入支持。 第三,也是最具意义的,Spring 将 EntityManager 的创建与销毁、事务管理等代码抽取出来...

    JPA核心知识讲解

    下面是 JPA 核心知识的讲解,包括 JPA 概述、JPA 入门、JPA 实体、JPA 实体管理器等。 JPA 概述 JPA 是什么?JPA 是 Java Persistence API 的缩写,全称为 Java 持久化 API。JPA 是一个 Java 标准,提供了一个通用...

    详解Spring Data JPA动态条件查询的写法

    Spring Data JPA 动态条件查询写法详解 Spring Data JPA 是一个基于 Java Persistence API(JPA)规范的数据访问框架,提供了强大的数据访问功能。在实际开发中,我们经常需要根据不同的条件进行数据查询,而 ...

    Eclipse开发 Struts 2 + Spring 2 + JPA + AJAX

    在本例中,`@PersistenceContext`注解用于由Spring自动注入一个`EntityManager`实例,这样我们就可以在Service层或DAO层中执行JPA操作。同时,`@Transactional`注解确保在执行数据库操作时方法总是在事务中,以保证...

    Java工作笔记-JPA中使用@query注解(分页查询实例)

    在Java开发中,Java Persistence API (JPA) 是一种用于管理关系数据库的框架,它提供了一种面向对象的方式来操作数据库。在JPA中,@Query注解允许开发者编写自定义的SQL或者HQL(Hibernate Query Language)来执行...

    Spring中使用OpenJPA

    5. **配置Spring的事务管理**:在服务层的类或方法上使用`@Transactional`注解,Spring会自动管理事务的开启、提交和回滚。 6. **测试**:编写测试用例,验证Spring和OpenJPA的集成是否成功。 通过以上步骤,你就...

    SpringMVC3.2+JPA使用注解的方式环境搭建

    在示例代码中,`TestCaseDaoImpl`类通过`@Service`注解被识别为Spring管理的服务层组件,其中使用了`@PersistenceContext`注解来注入`EntityManager`,这是JPA的核心组件,用于执行实体的增删改查操作: ```java @...

Global site tag (gtag.js) - Google Analytics