Java持久性API.ppt_第1页
Java持久性API.ppt_第2页
Java持久性API.ppt_第3页
Java持久性API.ppt_第4页
Java持久性API.ppt_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

Java持久性API,主要内容,通过一个简单实例介绍Java持久性涉及的问题 如何进行O/R映射 EntityManagerFactory接口 EntityManager接口 Query接口,25.1 Java持久性实例,数据库表创建 编写实体类 编写客户端程序 persistence.xml 文档结构,1 Java持久性实例,1.1 数据库表创建,1 Java持久性实例,1.2 编写实体类 声明为实体类 Entity Table(name = “address“, catalog = “test“) public class Address implements java.io.Serializable 声明成员 private Integer addressSeq; private String firstName; private String mi; private String lastName; private String street; private String city; private String state;,1 Java持久性实例,1.2 编写实体类 对属性进行操作 Id /主键 Column(name = “Address_Seq“, unique = true, nullable = false) public Integer getAddressSeq() return this.addressSeq; public void setAddressSeq(Integer addressSeq) this.addressSeq = addressSeq; 实体类与普通Java类没有什么区别。,1 Java持久性实例,1.3 编写客户端程序 方式1 通过依赖注入得到实体管理器工厂 PersistenceUnit private EntityManagerFactory factory; 通过实体管理器工厂得到实体管理器 EntityManager manager = factory.getManager(); 通过实体管理器创建Query对象,创建这个对象的过程把需要执行的查询语句作为参数,查询语句使用的是JPA QL。 String sql = “select u from user u“; Query q = manager.createQuery(u);,25.1 Java持久性实例,25.1.3 编写客户端程序 方式2 通过实体管理器Helper EntityManagerHelper管理事务 IAddressDAO执行SQL操作 见例子javaee_JPA,25.1 Java持久性实例,25.1.3 编写客户端程序 通过Query对象的方法得到查询的结果,查询的结果是实体的对象或者是实体的对象的集合。 ArrayList list = q.getResult(); 根据需要对实体对象进行操作 for(int i=0;ilist.size;i+) User temp = (User)list.get(i); System.out.println(user.getUserid(); System.out.println(user.getUsername(); System.out.println(user.getUserpass(); System.out.println(user.getUsertype(); ,25.1 Java持久性实例,25.1.4 persistence.xml 配置数据库表与实体之间的对应关系 user User ,25.1 Java持久性实例,25.1.5 文档结构 test.ear user.jar user.class META-INF persistence.xml client.jar userclient.class,25.2 O/R映射,教师-部门关系 普通教师类 public class Teacher private String tid; private String tname; private Department dept; . ,25.2 O/R映射,教师-部门关系 教师实体类 import javax.persistence.Entity; import javax.persistence.Id; Entity public class Teacher Id private String tid; private String tname; ManyToOne private Department dept; . ,25.3 EntityManagerFactory接口,接口定义 在Java EE环境中使用实体管理器工厂 在Java SE环境中使用实体管理器工厂,25.3 EntityManagerFactory接口,25.3.1 接口定义 创建新的实体管理器 public EntityManager createEntityManager(); 创建具有特定属性的实体管理器 public EntityManager createEntityManager(Map map); 关闭实体管理器工厂 public void close(); 判断工厂是否是打开状态 public boolean isOpen();,25.3 EntityManagerFactory接口,25.3.2在Java EE环境中使用实体管理器工厂 通过元注释注入 PersistenceUnit EntityManagerFactory emf; 注入之后可以直接使用,25.3 EntityManagerFactory接口,25.3.3在Java SE环境中使用实体管理器工厂 不能注入,只能通过Persistence的方法获取 EntityManagerFactory emf = javax.persistence.Persistence.createEntityManagerFactory(“Order“); EntityManager em = emf.createEntityManager();,25.4 EntityManager,25.4.1 接口定义 持久化一个实例 public void persist(Object entity); 合并实体的状态 public T merge(T entity); 删除实体实例 public void remove(Object entity); 根据主键查询实体 public T find(Class entityClass, Object primaryKey);,25.4 EntityManager,25.4.1 接口定义(续) 得到一个实体的引用 public T getReference(Class entityClass, Object primaryKey); 更新到数据库 public void flush(); 设置flush模式 public void setFlushMode(FlushModeType flushMode); 获取flush模式 public FlushModeType getFlushMode();,25.4 EntityManager,25.4.1 接口定义(续) 设置锁定模式 public void lock(Object entity, LockModeType lockMode); 从数据库中获取最新信息 public void refresh(Object entity); 清除持久性上下文 public void clear(); 判断是否包含特定实体 public boolean contains(Object entity);,25.4 EntityManager,25.4.1 接口定义(续) 创建执行查询的Query对象,参数就是查询 public Query createQuery(String qlString); 创建执行命名查询的Query对象 public Query createNamedQuery(String name); 创建执行普通SQL语句的Query对象 public Query createNativeQuery(String sqlString); 创建执行普通SQL语句的Query对象,同时指出查询结果的类型 public Query createNativeQuery(String sqlString, Class resultClass);,25.4 EntityManager,25.4.1 接口定义(续) 创建执行普通SQL语句的Query对象,同时指出映射方式 public Query createNativeQuery(String sqlString, String resultSetMapping); 参与一个事务 public void joinTransaction(); 得到实体管理器的提供者 public Object getDelegate(); 关闭实体管理器 public void close();,25.4 EntityManager,25.4.1 接口定义(续) 判断是否是open的 public boolean isOpen(); 返回事务对象 public void joinTransaction();,25.4 EntityManager,25.4.2 实例 Teacher t = new Teacher(); t.setTid(“0039“); t.setTname(“张三“); em.persist(t); /持久化对象 Teacher t = em.find(Teacher.class,“0011“); / 根据主键查找实体 em.remove(t); / 删除实体,25.4 EntityManager,25.4.3 Bean实例的生命周期,25.4 EntityManager,25.4.3 Bean实例的生命周期 4种状态 新建状态,一个新创建的实例没有持久标识,并且没有与上下文环境关联,在应用中创建一个实例之后,就处于这种状态。 被管理实体实例是具有持久标识的实例,并与一个持久上下文环境关联。 分离的实体实例是具有持久标识但是没有与持久上下文关联的实例。 删除的实体实例是具有持久标识并与上下文关联的实例,但是准备从数据库中删除。,25.4 EntityManager,25.4.3 Bean实例的生命周期 持久化实体实例 通过调用persist方法 删除实体 通过调用remove方法或者级联的删除操作 同步到数据库 在事务提交的时候,持久实体的状态被同步到数据库中。 同步操作会把对持久实体以及它们的关系的任何更新写到数据库中。,25.4 EntityManager,25.4.3 Bean实例的生命周期 分离实体:可能的来源如下 事务提交 事务回滚 删除持久上下文 关闭实体管理器 串行化一个实体或者通过值传递实体 合并分离的实体实例 通过合并操作 管理的实体实例,25.4 EntityManager,25.4.4 实体监听器和回调方法 实体监听器和生命周期回调方法用于监听实体生命周期事件。 可以定义在: 实体类上 超类 实体或者超类所关联的实体监听器类上。 可以通过元数据注释或者XML描述符定义,25.4 EntityManager,25.4.4 实体监听器和回调方法 实体监听器类 必须有一个公有的无参数的构造方法。 实体监听器类是无状态的。 生命周期回调方法应该遵循如下规则 生命周期回调方法可以抛出不确定的或者运行时异常。在事务中执行的回调方法抛出的运行时异常会导致事务回滚。 生命周期方法可以调用JNDI、JDBC、JMS和企业Bean。 通常在生命周期回调方法中,应用不应该调用EntityManger或者Query操作,访问其他的实体实例,或者修改关系。,25.4 EntityManager,25.4.4 实体监听器和回调方法 生命周期回调方法 方法签名 void () /定义在实体类或者超类 void (Object) / 定义在实体监听器类上 访问控制符不能为:static 或者 final 可用的元注释 PrePersist PostPersist PreRemove PostRemove PreUpdate PostUpdate PostLoad,25.4 EntityManager,25.4.4 实体监听器和回调方法 生命周期回调方法的语义 执行persist方法之前会调用PrePersist方法 执行remove操作之前会调用PreRemove方法 对于合并操作并且造成创建新的实体,在实体的状态被赋值之后会调用PrePersist方法 PostPersist回调方法在实体被持久化之后调用。 PostRemove回调方法在实体被删除之后调用。 PreUpdate回调方法分别发生在实体数据的更新操作之前。 PostUpdate回调方法分别发生在实体数据的更新操作之后。 当把实体从数据库中加载到当前持久上下文之后,或者使用refresh操作之后,会调用PostLoad回调方法。在查询的结果被返回或者访问之前,或者关系被遍历之前,PostLoad方法被调用。,25.4 EntityManager,25.4.5 在Java EE环境下获取实体管理器 使用容器管理的实体管理器 通过依赖注入 PersistenceContext EntityManager em; 从JNDI获取 Resource SessionContext ctx; EntityManager em = (EntityManager)ctx.lookup(“OrderEM“); 当使用应用管理的实体管理器 使用实体管理器工厂来管理实体管理器和持久上下文,25.4 EntityManager,25.4.6 获取一个应用管理的实体管理器 应用从实体管理器工厂获取应用管理的实体管理器。 不管在Java EE环境还是Java SE环境,使用EntityManagerFactory API获取应用管理的实体管理器是相同的。,25.5 Query接口,25.5.1 Query API 返回查询结果,具有多个对象 public List getResultList(); 返回查询结果,只有一个对象 public Object getSingleResult(); 执行用于更新的查询 public int executeUpdate(); 设置查询的最大记录数 public Query setMaxResults(int maxResult);,25.5 Query接口,25.5.1 Query API 设置查询结果的开始位置 public Query setFirstResult(int startPosition); 设置特定实现的提示信息 public Query setHint(String hintName, Object value); 设置命名参数 public Query setParameter(String name, Object value); 设置日期类型的命名参数 public Query setParameter(String name, Date value, TemporalType temporalType);,25.5 Query接口,25.5.1 Query API 设置Calendar类型的命名参数 public Query setParameter(String name, Calendar value, TemporalType temporalType); 设置位置参数 public Query setParameter(int position, Object value); 设置日期类型的位置参数 public Query setParameter(int position, Date value, TemporalType temporalType); 设置Calendar类型的位置参数 public Query setParameter(int position, Calendar value, TemporalType temporalType); 设置flush模式 public Query setFlushMode(FlushModeType flushMode);,25.5 Query接口,25.5.2 命名参数 “:”号后面跟一个标识符 命名参数是大小写敏感的 命名参数用于Java持久性查询语言,不能用于自然查询语言(普通的SQL查询),25.5 Query接口,25.5.3 命名查询 命名查询是用元数据表示的静态查询。 命名查询可以使用Java持久查询语言定义或者使用SQL查询。 查询的名字的作用范围是持久组。 实例:定义 NamedQuery( name=”findAllCustomersWithName”, query=”SELECT c FROM Customer c WHERE LIKE :custName” ) NamedQuery( name=”findAllCustomersWithName”, query=”SELECT c FROM Customer

温馨提示

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

评论

0/150

提交评论