扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
几个星期以前,我以“JPA:好与坏”为主题主办了一次 网上技术交流会。它受到了广泛的关注,因此,我没有足够的时间在这个时间空档结束时解答所有问题。这里只列出了对其中部分问题的答复。我将不断更新这篇博客文章,尽量解答其余的问题。
问题: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领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者