内容提要
本文介绍了如何将Jakarta Data与Spring和Hibernate集成,通过扩展BasicRepository接口和使用StatelessSession代替Stateful Session或JPA EntityManager来实现。还介绍了如何使用@Query注解定义数据访问方法和如何解析关联的StatelessSession。尽管Jakarta Data仍然是一个年轻的项目,但在Jakarta EE应用程序上运行或使用Quarkus时可能更具吸引力。
延伸解读
Jakarta Data 与 Spring Data JPA 的集成差异
文章指出,Spring Data JPA 会自动将上下文相关的 EntityManager 绑定到 Repository 代理,使同一事务中的多个 Repository 共享事务上下文。而 Jakarta Data 不被 Spring 原生支持,因此需要手动提供事务和连接管理机制,例如通过 StatelessSession 代理和 TransactionSynchronizationManager 来传播事务上下文。这增加了集成的复杂性。
StatelessSession 代理机制解析
为了在 Spring 事务中解析 StatelessSession,文章实现了一个 StatelessSessionInvocationHandler,它动态代理 StatelessSession 接口。该处理器从 TransactionSynchronizationManager 中获取当前 EntityManager,并从中提取连接,然后创建或复用 StatelessSession,将其绑定到事务同步管理器中。这样,每个 Repository 都能获取到与当前事务关联的 StatelessSession。
适用场景与当前局限性
文章认为,Jakarta Data 仍是一个年轻项目,功能上不及 Spring Data JPA。在 Spring 应用中集成较为复杂,且功能数量远少于 Spring Data JPA。因此,目前 Jakarta Data 可能更适合运行在 Jakarta EE 应用服务器(如 Payara)或使用 Quarkus 的场景。对于 Spring 应用,除非有特定需求,否则 Spring Data JPA 仍是更成熟的选择。
Q&A
Jakarta Data是什么?
Jakarta Data是一个新的Jakarta EE规范,提供构建数据仓库和数据访问对象的通用API。
如何将Jakarta Data与Spring和Hibernate集成?
通过扩展BasicRepository接口和使用StatelessSession替代Stateful Session或JPA EntityManager来实现集成。
Jakarta Data与Spring Data JPA有什么区别?
Jakarta Data仍然是一个年轻的项目,功能上不及Spring Data JPA,且在Spring应用中的集成较为复杂。
如何在Spring中使用StatelessSession?
需要提供StatelessSession代理对象,以便在Spring事务上下文中解析相关的StatelessSession。
Jakarta Data的Repository如何定义数据访问方法?
可以使用@Query注解定义JPQL查询,或通过方法名推导查询方法。
在使用Jakarta Data时,如何管理事务?
需要提供自己的事务和连接管理机制,以便从服务层传播事务上下文到Jakarta Data仓库。