科技行者

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

知识库

知识库 安全导航

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

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

  • 扫一扫
    分享文章到微信

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

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

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

关键字: 问题 常见 JPA java

  • 评论
  • 分享微博
  • 分享邮件
问题:相对于EJB2来说,EJB3可以处理多少个并发事务?

  回答:从纯会话bean的观点来讲,至少在WebLogic Server中,并发事务的数目没有什么差别。也就是,如果将您的应用程序从EJB2会话bean转换到EJB3会话bean,但是完全没有修改持久化机制,可能不会发现重大差别。这是因为EJB3规范对会话bean部分的大多数更改着重实现编程模型的改进。

  从实体bean的观点来讲,我认为对于大多数应用程序,WebLogic Server的EJB 2.1和JPA支持的并发事务数目相同。您可能发现JPA对于非主键的查询来说,可伸缩性更高。一旦开始钻研Kodo的 锁定组 之类的功能,则对于固定的域模型,可以从基于JPA的系统中获得更多并发事务。

  问题:如何为AquaLogic DSP应用JPA?

  回答:AquaLogic DSP着重关注对数据的多重存储访问,并将数据作为数据服务提供,通常作为XML或SDO呈现这些数据。JPA规范着重关注与数据存储交互的Java API。可以设想,JPA绑定到AquaLogic DSP,或SDO绑定到Kodo产品(BEA的JPA实现)。

  问题:JPA是否支持惰性加载?

  回答:是的。默认情况下,Collection和Map类型的字段是惰性检索的,而其他所有字段都是主动获取的。通过在字段的持久化注解中指明“fetch”属性,可以基于各个字段静态地控制该行为。

  问题:什么是实现过程的最佳位置,例如,检查许多用户及其帐户(在银行应用程序中)以付给利息?是在数据库的存储过程中实现,还是在EJB中使用JPA实现,还是同时使用这两种方式?

  回答:根据我的经验,这实际上取决于组织因素,而不是其他因素。一些工作室更喜欢在存储过程中进行大量编码,而另一些则喜欢在Java中实现其业务逻辑。每种方法各有优势和代价。

  尽管如此,还是有一些问题可促使他们优先考虑其中的一种环境。在您的例子中,在数据库中执行大量计算可能比将数据加载到内存中更快,因此使用存储过程可能比较合理。另一方面,数据库承担这么多负载将对该应用程序的用户产生负面影响,因此最好付出一定代价跨网络拉出这些数据,以便将该数据库用作严格的存储系统,而不是计算引擎。或者,如果应用程序的其余部分主要使用JPA,则适用的话,可能希望使用JPQL的大批量更新功能来进行更新。

  问题:如果不先将数据加载到内存中,是否可以执行大批量更新?

  回答:是的,可以通过JPQL执行大批量更新和大批量删除:

  UPDATE Employee e SET e.salary = e.salary * 1.1 WHERE e.salary < 100000

  问题:你们对Kodo JDO有什么规划?JPA是否会通过实现JDO的所有功能而将其取代?如果是的话,是否存在任何时间表?如果不是,你们会不会继续积极地开发JDO?

  回答:BEA仍然完全忠于JDO。从规范的观点来看,我认为过一段时间之后,JPA将包含当前的JDO规范中越来越多的功能。但是,我不了解Sun对JDO和JPA之间的融合工作有什么规划。

问题:什么是持久化单元?

  回答:持久化单元是类和配置设置的集合,可以根据该集合创建EntityManagerFactory。它在 persistence.xml 文件中作为一个条目出现。

  问题:如何在WebLogic 9.2中测试JPA

  回答:现在可以在WebLogic 9.2中使用OpenJPA或Kodo。该服务器不执行会话bean持久化单元注入,但是在10.0服务器中可以这么作,并且在9.2中,没有任何Kodo控制台集成。但是除了引导注入问题之外,应该能够在WebLogic 9.2中成功地使用JPA,包括参与托管事务。

  问题:JDBC连接对应于JPA中的什么概念?

  回答:JPA EntityManager大致相当于JDBC连接,而JPA EntityManagerFactory从概念上类似于JDBC数据源。JPA EntityTransaction(仅在JTA / appserver上下文以外可用)相当于JDBC连接的事务控制API。

  在OpenJPA中,EntityManager在其生命周期中可能使用多个不同的JDBC连接。请参阅 openjpa.ConnectionRetainMode 属性的文档了解详细信息。

  问题:关于fetch类型,如果默认是主动(eager)加载,则提供程序可能忽略惰性(lazy)加载指令。因此,即使将字段设置为惰性,也可能会加载不必要的数据。将来的规范会不会将其修改为必须与fecth类型一致?这会涉及到什么问题?

  回答:通常,OpenJPA永远不会忽略用户配置的FetchMode。这是提示而不是规则,因为惰性加载实际上是调优过程中一项关注事项,永远都不应该对应用程序产生行为性的影响*。JPA规范力图避免要求使用任何明确的性能调优策略,因为不同的网络拓扑结构、数据存储系统和应用程序行为需要不同的调优关注。

  例如,OpenJPA允许在运行时 动态控制 fetch配置。这意味着,它可能静态地配置对象模型,使某些字段进行惰性加载,然后动态地将其中一个字段添加到当前的fetch计划。这将导致OpenJPA违反静态定义的惰性设置。

  在当天结束时,如果实现对数据加载执行错误的操作,您应能够非常轻松地评估其他实现,通过威胁转移到另一个实现,以至少获得所需的功能。这是让大量供应商采用JPA规范的重大优势之一。

  *当然,如果您依靠惰性加载设置来防止加载某些数据,以免后来传输到不同的层(也就是为了数据安全性),那么惰性加载存在重要的行为性影响。在OpenJPA中,可以使用 fetch组 控制通过电缆发送数据图时确切地分离哪些数据。

  问题:在运行时更改fetch模式容不容易?

  回答:JPA规范没有为此提供任何工具。OpenJPA通过 fetch规划 接口提供了对fetch特征的详细控制。JPQL的“JOIN FETCH”结构也可以用于限制主动fetch提示。

  问题:使用乐观锁定时,@Version注释仅支持int字段吗,它可以是datetime吗?

  回答:根据JPA的要求,@Version可以对int、long、short、Integer、Short、Long和Timestamp类型的字段使用。(JPA规范的第9.1.17小节)。

  问题:在JPA可以调用存储过程吗?

  回答:JPA规范仅要求支持SELECT SQL语句(通过EntityManager.createNativeQuery()调用,或@NamedNativeQuery注解或named-native-query XML元素)。但是,我认为大多数实现也多少支持以相同方式调用存储过程。

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

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

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