【问题标题】:Can I use JPA without an external persistence provider?我可以在没有外部持久性提供程序的情况下使用 JPA 吗?
【发布时间】:2014-02-22 19:22:29
【问题描述】:
【问题讨论】:
标签:
java
mysql
jpa
persistence
【解决方案1】:
就像你刚才说的,JPA 只是一组规范。您不能使用规范,您只能使用这些规范的实现,为此您需要像 Hibernate 或 EclipseLink 这样的持久性提供......它实现了 JPA 规范。
【解决方案2】:
您不能在没有提供程序的情况下使用 JPA。您可以做的是仅在应用程序中使用 JPA 的标准功能,以允许轻松交换持久性提供程序(理论上)。在这种情况下,只有 JPA 接口和注解会被客户端代码直接使用。
另一种方法是使用持久性提供程序的专有特性来扩展 JPA。例如,您可以将持久性提供程序的专有注释与标准 JPA 注释结合起来以实现优化。在这种情况下,客户端代码直接依赖于持久化提供程序 API。
在实践中,很难编写 100% 标准的 JPA 代码。我不知道其他持久性提供程序,但 Hibernate 允许从 EntityManager 使用它的一些专有功能。
// Non-standard use of an HQL implicit select clause
Query query = em.createQuery("from Entity where ids in (:ids)");
// Non-standard use of a collection parameter in a native query
// Collection parameters are only standard for JPQL queries
Query query = em.createNativeQuery("select id from Table where id in (:ids)")
.setParameter("ids", listOfIds);
这还没有考虑每个持久性提供程序与数据库的交互方式。