使用JPA完成实体的增删改查.ppt_第1页
使用JPA完成实体的增删改查.ppt_第2页
使用JPA完成实体的增删改查.ppt_第3页
使用JPA完成实体的增删改查.ppt_第4页
使用JPA完成实体的增删改查.ppt_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第27章 使用JPA完成实体的增删改查,教材:Java EE实用教程,主要内容,27.1 实体的状态及操作 27.2获取EntityManagerFactory 27.3 获取实体管理器 27.4 如何使用实体管理器 27.5处理事务 27.6 在Web中使用JPA,27.1 实体的状态及操作,27.1.1 持久化实体实例,通过调用实体管理器的persist方法可以使一个实体实例变成管理的和持久的。 如果X是一个新的实体,会变成被管理的。在事务提交之前,X会被写到数据库中。 如果X是一个已经存在的被管理的实体,持久操作将被忽略。但是如果X与它的关联实体之间的关系使用cascade=PERSIST或者cascade=ALL标注,意味着持久操作将影响所关联的实体,会持久化关联的实体。例如订单包含多个订单项,在持久化订单的时候,会持久化订单所涉及的订单项。 如果X是一个删除的实体,它将变成被管理的。 如果X是一个分离的对象,当调用persist操作的时候,将抛出EntityExistsException。或者在调用flush或者commit方法的时候产生类似的异常。 对于所有实体X关联的实体Y,如果与Y的关联关系使用cascade=PERSIST或者cascade=ALL进行标注,持久操作将用于Y。例如在持久化订单的时候,与订单关联的订单项都会被持久化。,27.1.2 删除实体,通过调用实体管理器的remove方法或者级联的删除操作,一个被管理的实体实例可以变成被删除的。 如果X是一个新建的实体,remove操作将被忽略。但是删除操作会被级联到关联的实体,如果关联关系标注为cascade=REMOVE或者cascade=ALL。 如果X是一个被管理的实体实例,删除操作使得这个实体实例变成被删除状态。删除操作会被级联到关联的实体,如果关联关系标注为cascade=REMOVE或者cascade=ALL。 如果X是一个分离的实体,调用remove操作的时候,将抛出异常IllegalArgumentException。 如果X是一个删除的实体,remove操作将被忽略。 在事务被提交的时候或者之前,或者作为flush操作的结果,被删除的实体X将被从数据库中删除。 实体被删除之后,它的状态就是删除操作被调用的时候的状态。,27.1.3 同步到数据库,在事务提交的时候,实体的状态被更新到数据库中。 同步操作会把对持久实体的更新以及对它们的关系更新写到数据库中。,27.1.4 分离实体,一个分离的实体可能来自: 事务提交; 事务回滚; 删除持久上下文; 关闭实体管理器; 串行化一个实体或者通过值传递实体。 分离的实体实例继续在持久上下文环境之外存在,它们的状态不再被保证与数据库中状态一致。,27.1.5 合并分离的实体状态,把分离的实例的状态传递给实体管理器管理的持久实体。,27.1.6 管理的实体实例,应用需要保证一个实例只在一个持久上下文中被管理。 contains方法可以用于确定一个实体实例是否被当前持久化上下文管理。 contains方法返回true的情况是: 实体已经被从数据库中检索到,并且还没有被删除和分离 实体实例是新建的,已经使用persiste方法,或者已经被级联到persist操作。 contains方法返回false的情况是: 实例是分离的。 对实体调用了remove方法,或者已经被级联了remove方法。 如果实例是新建的,还没有被调用persist方法或者没有级联的persist。,27.2获取EntityManagerFactory,应用通过EntityManagerFactory接口来获取实体管理器。 通常EntityManagerFactory与persistence.xml中的persistenceUnit对应。 实体管理工厂可以注入,也可以通过Persistence类获取。,27.2.1 通过注入获取实体管理器工厂,使用javax.persistence.PersistenceUnit元注释: name:在环境引用上下文中访问EntityManagerFactory所使用的名字,如果使用依赖注入,就不需要了。默认值是空字符串。 unitName:在persistence.xml中定义的持久单元的名字。 例如: PersistenceUnit EntityManagerFactory emf;,27.2.2 通过Persistence类获取,通过调用javax.persistence.Persistence类的createEntityManagerFactory方法来创建实体管理器工厂。参数是持久单元的名字。 EntityManagerFactory emf = Persistence.createEntityManagerFactory(“OrderEM “);,27.3 获取实体管理器,EntityManager接口定义了与持久上下文环境进行交互的方法。包括创建实体、删除实体、修改实体、根据主键查询实体以及使用Query对象查询实体的方法。 实体管理器的获取可以通过3种方式: 注入实体管理器; 查找实体管理器; 使用实体管理器工厂创建实体管理器。,27.3.1 注入实体管理器,使用PersistenceContext注释来注入实体管理器。属性如下: name,在上下文环境引用中(例如SessionContext)访问实体管理器所使用的名字,如果使用依赖注入,就不需要了。默认值是空字符串。 unitName,持久单元的名字,如果指定了unitName元素,必须与在JNDI中能够访问的实体管理器的持久单元的名字相同。默认值是空字符串。 type,指定事务类型,事务类型包括扩展持久上下文(EXTEDNED)和事务范围的持久上下文(TRANSACTION)。使用PersistenceContextType.EXTENDED或者PersistenceContextType.TRANSACTION表示。 properties,为容器或者持久提供者指定属性。与特定持久性提供厂商相关的属性也可以包含在这组属性中。提供商不识别的属性将被忽略。默认值是。,27.3.1 注入实体管理器,下面的代码用于注入实体管理器。 例1: PersistenceContext EntityManager em; 例2: PersistenceContext(type=PersistenceContextType.EXTENDED) EntityManager orderEM;,27.3.2 通过简单查询查找实体管理器,首先需要在会话Bean的Bean类上通过PersistenceContext声明实体管理器,然后在会话Bean中查找该实体管理器。 在会话Bean的Bean类上声明持久上下文: PersistenceContext(name=“orderEM“) 注入SessionContext: Resource SessionContext ctx; 查找实体管理器: EntityManager em = (EntityManager)ctx.lookup(“orderEM“);,27.3.3 通过实体管理器工厂创建实体管理器,当使用应用管理的实体管理器的时候,应用必须使用实体管理器工厂来管理实体管理器和持久上下文生命周期,需要通过实体管理器工厂获取实体管理器。通常在Java SE环境下使用。 实体管理器工厂是EntityManagerFactory的对象,假设实体管理器工厂的对象是emf,创建实体管理器的代码如下: EntityManager em = emf.createEntityManager();,27.3.4 具体用法,如果在Java SE环境下,需要: 通过javax.persistence.Persistence创建EntityManagerFactory对象; 然后通过EntityManagerFactory对象创建EntityManager对象; 然后使用EntityManager对象。 如果在Java EE环境下: 还可以注入EntityManager对象和EntityManagerFactory对象。 如果是注入EntityManagerFactory,可以在注入之后创建EntityManager对象。,27.4 如何使用实体管理器,27.4.1 应用管理的实体管理器 27.4.2 容器管理的实体管理器,27.4.1 应用管理的实体管理器,对于无状态会话Bean,业务方法是共享的,所以通常在每个方法中创建自己的实体管理器,使用完之后关闭。 public Order getOrder(Long id) EntityManager em = emf.createEntityManager(); /创建 Order order = (Order)em.find(Order.class, id); em.close(); / 关闭 return order; ,27.4.1 应用管理的实体管理器,在会话中Bean中共享实体管理器 Stateless public class ShoppingCartImpl implements ShoppingCart PersistenceUnit private EntityManagerFactory emf; private EntityManager em; PostConstruct public void init() em = emf.createEntityManager();/创建 public Order getOrder(Long id) Order order = (Order)em.find(Order.class, id); em.clear(); / 清空实体管理器,实体变成分离的 return order; PreDestroy public void destroy() em.close(); / 关闭 ,27.4.1 应用管理的实体管理器,对有状态会话Bean来说,与无状态会话Bean的用法基本相同。不同的地方在于,有状态会话Bean的每个客户端对应一个Bean实例,不用每次操作之后都调用clear方法。 public void initOrder(Long id) order = em.find(Order.class, id); ,27.4.2 容器管理的实体管理器,在Web或者EJB容器中可以采用容器管理的实体管理器,通过PersistenceContext注入。 例如: PersistenceContext EntityManager em; 应用实例: Stateless public class ShoppingCartImpl implements ShoppingCart PersistenceContext EntityManager em; public Order getOrder(Long id) return em.find(Order.class, id); ,27.5处理事务,27.5.1 容器管理的JTA实体管理器 27.5.2 应用管理的JTA实体管理器 27.5.3 应用管理的resource-local的实体管理器,27.5.1 容器管理的JTA实体管理器,容器管理的事务范围的持久上下文 当容器管理的实体管理器被调用的时候,一个新的持久上下文开始,并且持久上下文已经与当前的JTA事务关联。当关联的JTA事务提交或者回滚的时候,持久上下文结束。 例: Stateless public class ShoppingCartImpl implements ShoppingCart PersistenceContext EntityManager em; public Order getOrder(Long id) return em.find(Order.class, id); ,27.5.1 容器管理的JTA实体管理器,容器管理的扩展持久上下文 容器管理的扩展持久上下文只能在一个有状态会话Bean中初始化。它的存在从创建它的有状态会话Bean开始,并且与有状态会话Bean绑定。对扩展持久上下文的依赖通过PersistenceContext注释或者persistence-context-ref部署描述符元素声明。 当有状态会话Bean的Remove方法完成的时候,持久上下文由容器关闭。 例: Stateful Transaction(REQUIRES_NEW) public class ShoppingCartImpl implements ShoppingCart PersistenceContext(type=EXTENDED) EntityManager em;,27.5.2 应用管理的JTA实体管理器,事务通过JTA进行控制的实体管理器称为JTA实体管理器。 UserTransaction是使用JTA事务管理器开始一个事务和结束一个事务的接口。得到UserTransaction资源之后,servlet调用UserTransaction的begin方法和commit方法来开始和提交事务。调用UserTransaction的rollback方法可以撤销事务中所有语句的执行结果来保证数据的一致性。 UserTransaction资源被注入到servlet中。,27.5.2 应用管理的JTA实体管理器,Resource UserTransaction utx; . try utx.begin(); bookDAO.buyBooks(cart); mit(); catch (Exception ex) try utx.rollback(); catch (Exception exe) System.out.println(“Rollback failed: “+exe.getMessage(); .,27.5.3 应用管理的resource-local实体管理器,应用通过En

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论