科技行者

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

知识库

知识库 安全导航

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

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

  • 扫一扫
    分享文章到微信

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

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

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

关键字: 问题 常见 JPA java

  • 评论
  • 分享微博
  • 分享邮件
 问题:在EJB3中,更新实体bean的单个字段/列会导致更新该DB行中的所有字段/列,还是仅更新该DB行中更改的列?

  回答:该行为取决于实现。OpenJPA将只更新被修改字段对应的列。但是,我们可能在某些位置添加update-all-columns选项。请参阅 OPENJPA-38。

  问题:EJB3.0如何替换EJB2.0中的ejbLoad()、ejbStore()之类的回调方法?

  回答:JPA规范提供了一些可以随意(单个)实现的 回调方法。

  问题:EJB3.0如何替换EJB2.0 CMP和BMP?

  回答:EJB3 JPA规范对EJB2 CMP提供了功能完善的替换。JPA规范没有解决bean管理的持久化,如果您希望实现自己的持久化,应该继续使用BMP,或者最好使用会话bean façade进行自定义持久化。

  问题:命名查询可以位于JPA实体以外吗?就像在会话bean或帮助类中那样?

  回答:JPA实现仅扫描实体类(和映射超类以及嵌入类)来查找命名查询。我希望将来的JPA规范版本提供一种方式,用于将命名查询限制到一个类对象中,到那个时候,就可以认为能够在任何位置定义命名查询。

  可以在orm.xml文件中定义命名查询,然后使您的持久化单元指向该orm.xml文件,JPA规范允许将任意数目的orm.xml文件合并到一起。

  问题:JPQL支持多数据库查询吗?

  回答:JPA规范并不要求实现必须只使用单个数据库(甚至实现必须使用关系数据库)。因此实现可以随意提供对多个数据库的访问。但是,据我所知,当前的JPA实现都没有这么作,除非是通过数据库方的工作来实现多数据库查询。

  问题:在JPQL中,SELECT子句可以从多个实体中拉出数据吗?

  回答:是的。JPQL语言允许查询聚合和投影。因此以下语句是有效的JPQL语句:

  select p.name, p.contactInfo.phoneNumber from Person p
  select p.address.state, avg(p.salary) from Person p group by p.address.state

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

  回答:JPA规范仅解决给定EntityManager相关对象的事务工作集的行为。它称之为“持久化上下文”。从某些方面来讲,这是一个缓存,但通常是为了保持事务一致性,而不是为了性能的原因。

  JPA规范没有解决性能缓存,如OpenJPA的 数据缓存 和 查询缓存。但是规范中的规则对这类性能缓存暗示了某些行为约束。

  总而言之,JPA规范主要关注的仅是API的行为方面,而由各种实现完成大多数性能有关的调优。尽管如此,所有可靠的实现都应该拥有某种数据缓存,以作为选择。

  问题:WebLogic Server 9.0仍然仅支持EJB2.0,是吗?

  回答:正确。WebLogic Server 10.0是完全支持EJB3规范的第一款BEA产品。在WebLogic Server 9中可以通过BEA Kodo产品来使用JPA。

问题:关于JPA的推荐教程是什么?

  回答:Kodo文档 中提供了许多JPA教程。

  问题:是否存在任何方式,用于跨所有实体表配置表前缀?

  回答:JPA规范中没有提供这种方式,在OpenJPA中,可以通过创建扩展的 DBDictionary 并重写getValidTableName()方法来实现该功能。

  问题:是否可能通过编程修改ORM绑定(如重写orm.xml中指定的一些ORM配置)?

  回答:不是通过JPA规范实现的。OpenJPA提供了一些方法,用于以编程的方式创建映射信息,并且该规范确实提供了一种方法,用于在创建EntityManager时,将特定于供应商的重写内容传递给persistence.xml中的数据。

  问题:我们正在构建一个大型应用程序,其中有350个对象坚持JPA规范。当我们使用Kodo 4.1持久化这些对象时,它的SELECT查询最终将每个查询的大多数表连接起来,这使得Kodo相当慢。TopLink Essentials实现仅连接少量的相关表。您对解决该问题有什么建议?

  回答:我认为这与“一对一”和“多对一”字段类型的不同默认行为有关。我猜想,如果您明确地告知Kodo对“一对一”和“多对一”字段类型执行惰性加载,就会很清楚。如果这不起作用,或者如果您希望获得更多帮助来分析您的具体用例,请发送电子邮件到plinskey@bea.com。

  问题:开发人员可以使用JPA来控制表的连接方式吗?

  回答:不能直接控制,并且不是通过规范实现的。但是,大多数实现可能提供了一些方式来影响如何连接。有关OpenJPA的详细信息,请参阅关于 主动fetching 的文档。

  问题:在何处指定数据源?

  回答:数据源通常是在persistence.xml中指定的,根据您的实现和应用服务器的默认行为,可能需要为jta-data-source和/或non-jta-data-source设置提供值。

  问题:JPA规范是否计划在将来支持里程碑或双时态链(bi-temporal)?

  回答:据我所知,JPA规范团队目前没有计划提供任何时态功能。

  问题:如果抛出乐观锁定异常,可以了解哪些列发生冲突吗

  回答:不可以。您可以了解哪些实例失败,但不是字段。给定失败的实例,很容易从数据库中加载新值,并进行比较。

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

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

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