科技行者

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

知识库

知识库 安全导航

至顶网软件频道JPA:好与坏?常见问题解答1

JPA:好与坏?常见问题解答1

  • 扫一扫
    分享文章到微信

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

 本文围绕着“JPA:好与坏”这个主题,对相关常见问题进行解答……

作者:Patrick Linskey, 来源:IT专家网 2008年5月8日

关键字: 问题 常见 JPA java

  • 评论
  • 分享微博
  • 分享邮件
 问题:EJB专家团队是如何摆脱事务描述符的?

  回答:在会话bean和消息驱动bean中,可以通过描述符和注释来控制事务的行为。此外,我们将默认的事务属性更改为“REQUIRED”,这个默认值比以前的值“SUPPORTS”更常用。因此,完全不必为业务方法配置事务行为。

  JPA实体仅供本地使用,重点关注域模型。因此,无法在JPA实体上配置事务性(或远程边界或安全性)。而是必须使用会话bean façade(或消息驱动bean),才可以通过EJB协议使用这些实体。通常来说,这是一件好事,配置安全性、远程处理和事务的粒度应该比持久化数据的粒度粗很多。JPA着重关注持久化数据,以及与EJB的其他部分和Java EE规范集成起来照管其他企业关注点。

  问题:推荐对主键使用“long”还是“Long”?如果允许使用null作为值,将会如何?

  回答:这实际上取决于您的数据模型。如果您的数据模型允许主键为null,那么使用Long,如果您的数据模型规定主键列不能为null,则使用long更合适。总的来说,我认为对于非复合主键,允许null作为合法值容易产生混淆,因此我倾向于使用long,而不是Long。

  问题:您说EJB 2.0不支持继承,但是可以在几个不同位置(远程/bean)使用继承,只是不在本地使用而已。请解释一下。

  回答:根据EJB 2.1规范的附录D3:

  当前的EJB规范未指定组件继承的概念。

  另一方面,JPA规范确实规定了实体继承的概念。我们已经处理了EJB 2.1规范中指出的各种问题和复杂性,现在允许完全的多态查询和关联。

  问题:BEA计划什么时候支持/发布EJB3?

  WebLogic Server 10 Technology Preview 是完全符合规范的Java EE 5应用服务器。它包括完整的EJB3支持。WebLogic Server 10大概于三月下旬发布。

  此外,Kodo 是完全符合规范的生产就绪JPA实现,并且已经发布。

  问题:JPA是否支持组合主键?

  回答:JPA支持自然ID和组合ID,以及数据库指派或实现指派的数字值。

  问题:是否存在Spring模板,像JDBC模板一样可以在容器外部使用?

  回答:是的,Spring 2有JPA模板。但是,Spring 2可以对任何标记着@Repository的bean执行JPA异常转译。因此,总的来说,对于新的应用程序,最好直接使用JPA API,而不是另一个模板层。对于使用模板和正在迁移到JPA的现有应用程序来说,使用模板方法比较合理。

  此外,可以像在Java EE服务器中一样将JPA的持久化单元部署到Spring,Spring对JPA规范中指出的EntityManager注入和查找服从容器规则。

  问题:JPA是否支持JDK1.4?

  回答:JPA需要Java 5或更新版本。

问题:使用范围查询时,它是否也会返回结果总数(例如,返回538项结果中的1-10项)?

  回答:不,要想获得总数,必须发出另外一个查询。通用模式是,在第一次执行搜索时获得总数,然后通过页面浏览结果,将总数存储到方便的位置(会话状态、cookie等):

  if (isFirstPage()) { // this is the first time we're executing this query
  Query q = em.createQuery("SELECT COUNT(p) FROM Product p WHERE ...");
  long count = ((Long) q.getSingleResult()).longValue();
  // store count somewhere stateful
  }
  Query q = em.createQuery("SELECT p FROM Product p WHERE ...");
  q.setFirstResult(page * PAGE_SIZE); // page is stored somewhere stateful
  q.setMaxResults(PAGE_SIZE);

  问题:具有JPA包装器的Hibernate是不是一种EJB3实现?

  回答:JPA规范是完整的EJB3规范的子集,因此JPA实现本身不是完整的EJB3实现。我不了解RedHat的EJB3实现的情况如何。但,Hibernate是JPA实现。

  问题:与Hibernate相比,JPA是不是更好?

  回答:JPA是规范,而Hibernate是实现。因此,这是不同事物的比较。可以肯定,使用标准API比使用专有API有更多优势,但不存在真正的劣势。

  问题:是不是不再需要学习和使用Hibernate?

  回答:规范团队关于JPA 1的目标之一是制定一个可以由很多供应商实现的API,并且开发人员可以编码来实现该API,而不是使用私有供应商特有的API。我们已成功实现这个目标,因此您只需使用供应商特有的API来获得JPA规范没有解决但您的应用程序中需要的功能。我的建议是尽可能地使用JPA API,但是当需要供应商公开但是规范中没有提供的功能时,则使用供应商特有的API。

  例如,OpenJPA提供了保存点功能,但JPA规范没有。因此,希望使用保存点的OpenJPA开发人员应该对代码的大部分内容使用JPA规范,而借助OpenJPAEntityManager来设置和管理保存点。

  问题:规范是否解决了缓存问题?

  回答:JPA规范没有解决二级缓存问题(EntityManagerFactory-级),但是提供了实现该缓存必须遵守的一些数据锁定和一致性规则,即使在启用缓存时也是如此。

  有少量与缓存有关的主题可能会在将来的JPA规范版本中解决,但是大多数缓存主题不必指定规则,这样,不同的供应商就可以轻松地完成不同的工作。此处增加的最重要的内容是一些基本缓存控制API,如回收某些对象ID,或将一些经常访问的ID固定到缓存中。

  问题:既然实体管理器承担了所有繁重的工作负载,那么会话bean还有什么价值?

  回答:EntityManager负责域对象模型和数据库之间的交互,但是仍然在会话中实现安全性、事务控制、远程处理、有状态的临时数据存储,而操作单元编程模型无法解决以上问题。会话bean还是部署单元和公用服务边界。因此,会话bean是定义所有业务代码的地方。换而言之,会话bean是EJB容器关注的,而JPA实现是在会话bean中使用的。

  当然,您还可以直接从servlet或JSP或其他任何可以使用Java 5的地方使用JPA。但是这样的话,您就必须管理自己的事务、处理自己的集群服务故障转移、管理自己的服务重部署等。

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

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

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