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固定到缓存中。

问题:如果不先将数据加载到内存中,是否可以执行大批量更新?
回答:是的,可以通过JPQL执行大批量更新和大批量删除:
UPDATE Employee e SET e.salary = e.salary * 1.1 WHERE e.salary < 100000

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

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

问题:使用乐观锁定时,@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元素)。但是,我认为大多数实现也多少支持以相同方式调用存储过程。

问题:命名查询可以位于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是否支持惰性加载?
回答:是的。默认情况下,Collection和Map类型的字段是惰性检索的,而其他所有字段都是主动获取的。通过在字段的持久化注解中指明“fetch”属性,可以基于各个字段静态地控制该行为。

问题:开发人员可以使用JPA来控制表的连接方式吗?
回答:不能直接控制,并且不是通过规范实现的。但是,大多数实现可能提供了一些方式来影响如何连接。

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

问题:如果抛出乐观锁定异常,可以了解哪些列发生冲突吗
回答:不可以。您可以了解哪些实例失败,但不是字段。给定失败的实例,很容易从数据库中加载新值,并进行比较。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值