科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道使用EJB3 Java 持久化API(3)

使用EJB3 Java 持久化API(3)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

持久化对于大部分企业应用来说都是至关重要的,因为它们需要访问关系数据库,尽管有不少选择可以用来来构建应用程序的持久化层,但是并没有一个统一的标准可以用在Java EE环境和Java SE环境中。

来源:IT专家网 2008年5月5日

关键字: java

  • 评论
  • 分享微博
  • 分享邮件
就像前面提到的,一个包含了任何数据库改变的entity manager的操作都必须在一个事务上下文中进行。

  下面的表列出了EntityManager接口的一些重要方法,这些方法用于进行实体操作。

 方法  目的
 public void persist(Object entity);  持久化一个实体的实例
 public T merge(T entity);  合并一个detached实体
 public void remove(Object entity);  删除实体的实例
 public T find(Class entityClass, Object primaryKey);  通过主键获取实体的实例
 public void flush();  将实体的状态与数据库同步

  可以使用persist()方法来持久化一个实体的实例。例如,如果想要持久化Contractor的一个实例,使用以下的代码:

@PersistenceContext(unitName="onjava")
private EntityManager em;
...
Contractor pte = new Contractor();
pte.setName("Nistha")
pte.setHourlyRate(new Double(100.0));
em.persist(pte);

  如果持久化了一个实体,并且实体上的关系的CascadeType被设置为PERSIST或者是ALL的话,那么任何和该实体关联的实体的状态变化都会被持久化。除非你使用一个扩展的持久化上下文,否则的话,实体在事务结束以后就会变成detached状态。merge操作允许你使用一个持久化上下文将一个detached实体存储到数据库中,这个detached实体的状态将会和数据库同步。这可以使你摆脱在EJB 2.x 时代普遍使用的DTO这种反模式,因为现在实体都是POJO,可以在各个层之间传递。对于实体类的唯一要求就是要实现java.io.Serializable接口。

  查询API

  持久化的另一个重要问题就是实体的获取。当使用EJB3 JPA时,查询使用java 持久化查询语言来表达。JPQL是EJB QL(EJB2.0中引入)的一个扩展。但是,EJB3 JPA,解决了EJB QL的一些限制并且增加了新的功能,使之成为一个强大的查询语言。

  JPQL对于EJBQL 2.x的增强

  以下是JPQL的一些新功能:

  •   ---简化的查询语法
  •   ---连接操作
  •   ---Group By 和 Having 语句
  •   ---子查询
  •   ---动态查询
  •   ---命名参数
  •   ---批量更新和删除

  而且,你可以使用native SQL来查询实体如果你需要特定的数据库查询扩展的话。

动态查询 vs. 命名查询

  你可以使用动态查询或者命名查询。一个命名查询和实体存储在一起,并且可以在程序中重复使用。

  为了创建一个动态查询,使用entity manager接口的createQuery方法,如下:

Query query = em.createQuery(
 "select e from Employee e where e.empNo > ?1");
 query.setParameter(1,100);
 return query.getResultList();

  如果想要使用命名查询来进行这个查询,在实体类中使用NamedQuery标注,如下:

@Entity
@NamedQuery(name="findAllEmployee",
   query="select e from Employee e where e.empNo > ?1")
 public abstract class Employee implements Serializable {
 }

  为了执行一个命名查询,首先使用EntityManager接口的createNamedQuery方法来创建一个Query实例,如下:

query = em.createNamedQuery(" findAllEmployee");
query.setParameter(1,100);
return query.getResultList();

  命名参数

  你可以在EJBQL中使用命名参数来代替位置参数,例如,你可以使用如下方法来改写上面的查询:

"select e from Employee e where e.empNo > :empNo "

  如果在查询中使用命名参数,你必须使用如下的方法来设置参数:

 query = em.createNamedQuery("findAllEmployee");
 query.setParameter("empNo",100);
 return query.getResultList();

  打包

  EJB3 JPA标准化了POJO的持久化操作。因此,实体并不限于EJB模块,它们可以打包在一个Web模块中,一个ejb-jar模块,EAR级别的类模块,或者一个标准的Jar文件中。你也可以在J2SE环境中使用实体。你必须将一个部署描述符文件(在persistence.xml)打包进去。

<persistence>
<persistence-unit name="onjava">
<provider>oracle.toplink.essentials.PersistenceProvider</provider>
<jta-data-source>jdbc/OracleDS</jta-data-source>
...
</persistence-unit>
</persistence>

  这个部署描述符确定了持久化提供者,持久化单元以及持久化单元使用的数据源。顾名思义,一个持久化单元就是需要一起管理的一组实体。如果你在一个特定的模块中定义了唯一一个持久化单元,你就不需要在persistence.xml中定义实体类,持久化提供者会自动找到实体类。

TopLink Essentials:参考实现

  TopLink Essentials,是从主要的一个商业O-R映射框架Oracle TopLink中衍生出来的,这是EJB3 JPA的一个参考实现。可以从Java Persistence API implementation home page找到它。

  你可以在一个该参考实现的服务器或者其他的遵循EJB3 JPA固定的应用服务器上使用本文中的代码。

  EJB3 JPA工具

  开发工具确实能够帮助你创建更好的应用程序——并且如果你使用XML来定义O-R映射,操作会很繁琐。Eclipse Dali O-R映射项目致力于使得EJB3 JPA变得更加简单,它在Eclipse Web工具项目中提供了综合的工具,这个项目是Oracle领导的,并且被JBoss,BEA以及Versant所支持。想要了解更多关于Dali的信息请访问它的主页。

  同样的,Oracle JDeveloper 10.1.3和BEA Workshop studio这样的工具也支持EJB3 JPA。

  结论

  EJB3 Java持久化API标准化了Java平台的持久化操作。它通过使用元数据标注简化了透明持久化操作。几个应用服务器,包括Oracle Application Server 10g (10.1.3), Sun公司的开源的 GlassFish Application Server, and JBoss Application Server 4.0, 都提供了EJB3 规范的支持。当Java EE5.0和EJB 3.0最终确定下来,你可以很快看到很多领先的应用服务器和持久化提供者都实现了EJB3 Java Persistence API。你可以使用GlassFish项目提供的参考实现来开始EJB3的持久化的使用。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章