竹笋

首页 » 问答 » 常识 » SpringJPA中文教程之JPA介绍
TUhjnbcbe - 2023/11/14 21:04:00

本节介绍通过以下两种方式配置SpringDataJPA的基础知识:

“Spring命名空间”(XML配置)

“基于注释的配置”(Java配置)

Spring命名空间

SpringData的JPA模块包含一个自定义名称空间,允许定义存储库bean。它还包含某些JPA特有的功能和元素属性。通常,可以通过使用repositories元素来设置JPA存储库,如以下示例所示:

使用命名空间设置JPA存储库

使用该repositories元素可按“创建存储库实例”中所述查找SpringData存储库。除此之外,它

Repository还会激活所有注释了的bean的持久性异常转换,以使JPA持久性提供程序引发的异常转换为Spring的DataAccessException层次结构。

自定义命名空间属性

除了repositories元素的默认属性外,JPA命名空间还提供了其他属性,使您可以更详细地控制存储库的设置:

如果未定义显式数据,SpringDataJPA要求提供一个PlatformTransactionManager名为的bean。transactionManagertransaction-manager-ref

基于注释的配置

SpringDataJPA存储库支持不仅可以通过XML名称空间来激活,还可以通过JavaConfig使用注释来激活,如以下示例所示:

使用JavaConfig的SpringDataJPA存储

您必须创建LocalContainerEntityManagerFactoryBean而不是EntityManagerFactory直接创建,因为前者除了创建外还参与异常转换机制EntityManagerFactory。

前面的配置类使用的EmbeddedDatabaseBuilderAPI建立了嵌入式HSQL数据库spring-jdbc。然后,SpringData会设置一个,EntityManagerFactory并使用Hibernate作为示例持久性提供程序。在此声明的最后一个基础结构组件是JpaTransactionManager。最后,该示例通过使用

EnableJpaRepositories注释激活SpringDataJPA存储库,该注释实质上具有与XML名称空间相同的属性。如果未配置任何基本程序包,它将使用配置类所在的程序包。

引导模式

默认情况下,SpringDataJPA存储库是默认的SpringBean。它们是单例作用域的,并且急切地初始化。在启动过程中,它们已经与JPA交互以EntityManager进行验证和元数据分析。SpringFrameworkEntityManagerFactory在后台线程中支持JPA的初始化,因为该过程通常在Spring应用程序中占用大量启动时间。为了有效地利用该后台初始化,我们需要确保JPA存储库尽可能早地初始化。

从SpringDataJPA2.1开始,您现在可以配置BootstrapMode(通过

EnableJpaRepositories注释或XML名称空间)采用以下值得:

DEFAULT(默认)—急切地实例化存储库,除非用显式注释

Lazy。仅当没有任何客户Bean需要存储库实例时,lazification才有效,因为这将需要初始化存储库bean。LAZY—隐式地将所有存储库bean声明为惰性的,并且还使创建的惰性初始化代理被注入到客户端bean中。这意味着,如果客户端bean仅将实例存储在字段中并且在初始化期间不使用存储库,则不会实例化存储库。首次与存储库交互时,将初始化并验证存储库实例。DEFERRED—与基本上具有相同的操作模式LAZY,但响应触发存储库初始化,ContextRefreshedEvent以便在应用程序完全启动之前验证存储库。

推荐建议

如果您不使用默认引导方式的异步JPA引导棒。

如果您以异步方式引导JPA,这DEFERRED是一个合理的默认值,因为它可以确保SpringDataJPA引导仅在EntityManagerFactory其花费比初始化所有其他应用程序组件更长的时间时才等待安装。尽管如此,它仍可以确保在应用程序发出信号之前,对存储库进行了正确的初始化和验证。

LAZY是测试方案和本地开发的不错选择。一旦确定了存储库将正确引导后,或者在测试应用程序的其他部分的情况下,对所有存储库执行验证可能只会不必要地增加启动时间。这同样适用于本地开发,在本地开发中,您仅访问应用程序的某些部分,而这些部分可能只需要初始化一个存储库即可。

1
查看完整版本: SpringJPA中文教程之JPA介绍