此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10spring-doc.cadn.net.cn

JPA的

Spring JPA 可在org.springframework.orm.jpa套餐、优惠 对 Java Persistence 的全面支持 API 以类似于与 Hibernate 集成的方式,同时意识到 底层实现,以便提供其他功能。spring-doc.cadn.net.cn

在 Spring 环境中设置 JPA 的三个选项

Spring JPA 支持提供了三种设置 JPA 的方法EntityManagerFactory应用程序用于获取实体管理器。spring-doc.cadn.net.cn

LocalEntityManagerFactoryBean

只能在简单的部署环境(如独立部署环境)中使用此选项 应用和集成测试。spring-doc.cadn.net.cn

LocalEntityManagerFactoryBean创建一个EntityManagerFactory适合人群 应用程序仅使用 JPA 进行数据访问的简单部署环境。 工厂 bean 使用 JPAPersistenceProvider自动检测机制(根据 到 JPA 的 Java SE 引导),并且在大多数情况下,仅要求您指定 持久性单元名称。以下 XML 示例配置了这样的 bean:spring-doc.cadn.net.cn

<beans>
	<bean id="myEmf" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
		<property name="persistenceUnitName" value="myPersistenceUnit"/>
	</bean>
</beans>

这种形式的 JPA 部署是最简单和最有限的。您不能引用 现有 JDBCDataSourcebean 定义,并且不支持全局事务 存在。此外,持久类的编织(字节码转换)是 特定于提供者,通常需要在启动时指定特定的 JVM 代理。这 选项仅适用于独立应用程序和测试环境,对于以下情况 JPA 规范已设计。spring-doc.cadn.net.cn

从 JNDI 获取 EntityManagerFactory

在部署到 Jakarta EE 服务器时,可以使用此选项。检查服务器的文档 关于如何将自定义 JPA 提供程序部署到您的服务器中,允许不同的 provider 比服务器的默认值高。spring-doc.cadn.net.cn

获取EntityManagerFactory来自 JNDI(例如在 Jakarta EE 环境中), 是更改 XML 配置的问题,如以下示例所示:spring-doc.cadn.net.cn

<beans>
	<jee:jndi-lookup id="myEmf" jndi-name="persistence/myPersistenceUnit"/>
</beans>

此作假定标准 Jakarta EE 引导。Jakarta EE 服务器自动检测 持久性单位(实际上,META-INF/persistence.xml应用程序 jar 中的文件)和persistence-unit-refJakarta EE 部署描述符中的条目(例如web.xml) 并定义这些持久性单元的环境命名上下文位置。spring-doc.cadn.net.cn

在这种情况下,整个持久性单元的部署,包括编织 (字节码转换)的持久性类,取决于 Jakarta EE 服务器。The JDBCDataSource通过META-INF/persistence.xml文件。EntityManager事务与服务器的 JTA 子系统集成。Spring只是 使用获得的EntityManagerFactory,通过 持久性单元的依赖注入和管理事务(通常 通过JtaTransactionManager).spring-doc.cadn.net.cn

如果在同一应用程序中使用多个持久性单元,则此类 Bean 名称 JNDI 检索到的持久性单元应与持久性单元名称匹配,而 应用程序用来引用它们(例如,在@PersistenceUnit@PersistenceContext注释)。spring-doc.cadn.net.cn

LocalContainerEntityManagerFactoryBean

您可以在基于 Spring 的应用程序环境中使用此选项来实现完整的 JPA 功能。 这包括 Tomcat 等 Web 容器、独立应用程序和 具有复杂持久性要求的集成测试。spring-doc.cadn.net.cn

LocalContainerEntityManagerFactoryBean完全控制EntityManagerFactory配置,适用于以下环境: 需要细粒度定制。这LocalContainerEntityManagerFactoryBean创建一个PersistenceUnitInfo实例基于persistence.xml文件,则 提供dataSourceLookup策略,并指定的loadTimeWeaver.因此, 可以使用 JNDI 之外的自定义数据源并控制编织 过程。以下示例显示了LocalContainerEntityManagerFactoryBean:spring-doc.cadn.net.cn

<beans>
	<bean id="myEmf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="dataSource" ref="someDataSource"/>
		<property name="loadTimeWeaver">
			<bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
		</property>
	</bean>
</beans>

以下示例显示了典型的persistence.xml文件:spring-doc.cadn.net.cn

<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
	<persistence-unit name="myUnit" transaction-type="RESOURCE_LOCAL">
		<mapping-file>META-INF/orm.xml</mapping-file>
		<exclude-unlisted-classes/>
	</persistence-unit>
</persistence>
<exclude-unlisted-classes/>快捷方式表示未扫描 带注释的实体类应该出现。显式“true”值 (<exclude-unlisted-classes>true</exclude-unlisted-classes/>)也意味着不扫描。<exclude-unlisted-classes>false</exclude-unlisted-classes/>确实会触发扫描。 但是,我们建议省略exclude-unlisted-classes元素 如果要进行实体类扫描。

使用LocalContainerEntityManagerFactoryBean是最强大的 JPA 设置 选项,允许在应用程序内进行灵活的本地配置。它支持 指向现有 JDBC 的链接DataSource,支持本地和全局事务,以及 依此类推。但是,它也对运行时环境提出了要求,例如 如果持久性提供程序要求,则提供具有 weaving 功能的类加载器的可用性 字节码转换。spring-doc.cadn.net.cn

此选项可能与 Jakarta EE 服务器的内置 JPA 功能冲突。在 完整的 Jakarta EE 环境,请考虑获取您的EntityManagerFactory来自 JNDI。 或者,指定自定义persistenceXmlLocation在您的LocalContainerEntityManagerFactoryBean定义(例如, META-INF/my-persistence.xml),并在 应用程序 jar 文件。因为 Jakarta EE 服务器只查找默认值META-INF/persistence.xml文件,它会忽略此类自定义持久性单元,因此, 避免与 Spring 驱动的 JPA 设置发生冲突。spring-doc.cadn.net.cn

什么时候需要装载时织造?

并非所有 JPA 提供者都需要 JVM 代理。Hibernate 就是一个没有的例子。 如果您的提供商不需要代理,或者您有其他替代方案,例如 在构建时通过自定义编译器或 Ant 任务应用增强功能时,您不应使用 加载时间编织机。spring-doc.cadn.net.cn

LoadTimeWeaverinterface 是一个 Spring 提供的类,它允许 JPAClassTransformer实例是否以特定方式插入,具体取决于 environment 是 Web 容器或应用程序服务器。挂钩ClassTransformers通过代理通常效率不高。代理针对整个虚拟机工作,并且 检查每个已加载的类,这在生产中通常是不受欢迎的 服务器环境。spring-doc.cadn.net.cn

Spring 提供了许多LoadTimeWeaver针对各种环境的实现, 让ClassTransformer实例仅应用于每个类加载器,而不是 对于每个虚拟机。spring-doc.cadn.net.cn

请参阅 AOP 章节中的 Spring 配置 更多关于LoadTimeWeaver实现及其设置,无论是 通用或针对各种平台(例如 Tomcat、JBoss 和 WebSphere)进行定制。spring-doc.cadn.net.cn

Spring 配置中所述,您可以配置 一个上下文范围LoadTimeWeaver通过使用@EnableLoadTimeWeaving注释或context:load-time-weaverXML 元素。这样的全球织工自动捡起 由所有 JPALocalContainerEntityManagerFactoryBean实例。以下示例 显示了设置加载时编织器的首选方法,提供自动检测 平台(例如,Tomcat 的具有编织功能的类加载器或 Spring 的 JVM 代理) 以及织布机自动传播到所有织工感知豆子:spring-doc.cadn.net.cn

<context:load-time-weaver/>

<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
	...
</bean>

但是,如果需要,您可以通过loadTimeWeaver属性,如以下示例所示:spring-doc.cadn.net.cn

<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
	<property name="loadTimeWeaver">
		<bean class="org.springframework.instrument.classloading.ReflectiveLoadTimeWeaver"/>
	</property>
</bean>

无论 LTW 是如何配置的,通过使用此技术,JPA 应用程序依赖于 检测可以在目标平台(例如 Tomcat)中运行,而无需代理。 当托管应用程序依赖于不同的 JPA 时,这一点尤其重要 实现,因为 JPA 转换器仅应用于类加载器级别,并且 因此,彼此隔离。spring-doc.cadn.net.cn

处理多个持久性单元

对于依赖于多个持久性单元位置(存储在各种 JARS 在类路径中),Spring 提供了PersistenceUnitManager充当 一个中央存储库,并避免持久性单元发现过程,这可能是 贵。默认实现允许指定多个位置。这些位置是 解析,然后通过持久性单元名称进行检索。(默认情况下,类路径 被搜索META-INF/persistence.xml文件。以下示例配置 多个地点:spring-doc.cadn.net.cn

<bean id="pum" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
	<property name="persistenceXmlLocations">
		<list>
			<value>org/springframework/orm/jpa/domain/persistence-multi.xml</value>
			<value>classpath:/my/package/**/custom-persistence.xml</value>
			<value>classpath*:META-INF/persistence.xml</value>
		</list>
	</property>
	<property name="dataSources">
		<map>
			<entry key="localDataSource" value-ref="local-db"/>
			<entry key="remoteDataSource" value-ref="remote-db"/>
		</map>
	</property>
	<!-- if no datasource is specified, use this one -->
	<property name="defaultDataSource" ref="remoteDataSource"/>
</bean>

<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
	<property name="persistenceUnitManager" ref="pum"/>
	<property name="persistenceUnitName" value="myCustomUnit"/>
</bean>

默认实现允许自定义PersistenceUnitInfo实例 (在将它们提供给 JPA 提供者之前)要么是声明性的(通过其属性,其中 影响所有托管单元)或以编程方式(通过PersistenceUnitPostProcessor,允许持久性单元选择)。如果没有PersistenceUnitManager指定时,由LocalContainerEntityManagerFactoryBean.spring-doc.cadn.net.cn

后台引导

LocalContainerEntityManagerFactoryBean支持后台引导 这bootstrapExecutor属性,如以下示例所示:spring-doc.cadn.net.cn

<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
	<property name="bootstrapExecutor">
		<bean class="org.springframework.core.task.SimpleAsyncTaskExecutor"/>
	</property>
</bean>

实际的 JPA 提供程序引导被移交给指定的执行程序,然后,并行运行,到应用程序引导线程。公开的EntityManagerFactory代理可以注入到其他应用程序组件中,甚至能够响应EntityManagerFactoryInfo配置检查。但是,一旦实际的 JPA 提供程序被其他组件访问(例如,调用createEntityManager),这些calls 块,直到后台引导完成。特别是,当您使用Spring Data JPA 时,请确保也为其存储库设置延迟引导。spring-doc.cadn.net.cn

从 6.2 开始,JPA 初始化是在上下文刷新完成之前强制执行的,等待 届时完成异步引导。这使得完全 初始化的数据库基础结构可预测,并允许自定义初始化后 逻辑ContextRefreshedEvent听众等。将这样的应用级数据库 初始化为@PostConstruct不推荐使用方法等;这是 更好地定位在Lifecycle.start(如适用)或ContextRefreshedEvent听者。spring-doc.cadn.net.cn

实现基于 JPA 的 DAO:EntityManagerFactoryEntityManager

虽然EntityManagerFactory实例是线程安全的,EntityManager实例 不是。注入的 JPAEntityManager行为类似于EntityManager从 应用程序服务器的 JNDI 环境,如 JPA 规范所定义。它委托 对当前事务的所有调用EntityManager,如果有的话。否则,它会回退 到新创建的EntityManager实际上使其使用线程安全。

可以在没有任何 Spring 依赖项的情况下针对普通 JPA 编写代码,通过以下方式 使用注入的EntityManagerFactoryEntityManager.Spring 可以理解@PersistenceUnit@PersistenceContext字段和方法上的注释 level 如果PersistenceAnnotationBeanPostProcessor已启用。以下示例 显示了一个普通的 JPA DAO 实现,该实现使用@PersistenceUnit注解:spring-doc.cadn.net.cn

public class ProductDaoImpl implements ProductDao {

	private EntityManagerFactory emf;

	@PersistenceUnit
	public void setEntityManagerFactory(EntityManagerFactory emf) {
		this.emf = emf;
	}

	public Collection loadProductsByCategory(String category) {
		EntityManager em = this.emf.createEntityManager();
		try {
			Query query = em.createQuery("from Product as p where p.category = ?1");
			query.setParameter(1, category);
			return query.getResultList();
		}
		finally {
			if (em != null) {
				em.close();
			}
		}
	}
}
class ProductDaoImpl : ProductDao {

	private lateinit var emf: EntityManagerFactory

	@PersistenceUnit
	fun setEntityManagerFactory(emf: EntityManagerFactory) {
		this.emf = emf
	}

	fun loadProductsByCategory(category: String): Collection<*> {
		val em = this.emf.createEntityManager()
		val query = em.createQuery("from Product as p where p.category = ?1");
		query.setParameter(1, category);
		return query.resultList;
	}
}

前面的 DAO 不依赖于 Spring,并且仍然很好地融入 Spring 应用程序上下文。此外,DAO 利用注释来要求 注入默认值EntityManagerFactory,如以下示例 bean 定义所示:spring-doc.cadn.net.cn

<beans>

	<!-- bean post-processor for JPA annotations -->
	<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>

	<bean id="myProductDao" class="product.ProductDaoImpl"/>

</beans>

作为显式定义PersistenceAnnotationBeanPostProcessor, 考虑使用 Springcontext:annotation-config应用程序中的 XML 元素 上下文配置。这样做会自动注册所有 Spring 标准 用于基于注释的配置的后处理器,包括CommonAnnotationBeanPostProcessor等等。spring-doc.cadn.net.cn

请考虑以下示例:spring-doc.cadn.net.cn

<beans>

	<!-- post-processors for all standard config annotations -->
	<context:annotation-config/>

	<bean id="myProductDao" class="product.ProductDaoImpl"/>

</beans>

这种 DAO 的主要问题是它总是创建一个新的EntityManager通过 工厂。您可以通过请求事务性来避免这种情况EntityManager(也称为“shared EntityManager”,因为它是实际事务EntityManager)而不是工厂的共享线程安全代理。以下示例显示了如何执行此作:spring-doc.cadn.net.cn

public class ProductDaoImpl implements ProductDao {

	@PersistenceContext
	private EntityManager em;

	public Collection loadProductsByCategory(String category) {
		Query query = em.createQuery("from Product as p where p.category = :category");
		query.setParameter("category", category);
		return query.getResultList();
	}
}
class ProductDaoImpl : ProductDao {

	@PersistenceContext
	private lateinit var em: EntityManager

	fun loadProductsByCategory(category: String): Collection<*> {
		val query = em.createQuery("from Product as p where p.category = :category")
		query.setParameter("category", category)
		return query.resultList
	}
}

@PersistenceContext注释有一个可选属性,名为type,默认为 自PersistenceContextType.TRANSACTION.您可以使用此默认值接收共享的EntityManager代理。替代方案PersistenceContextType.EXTENDED,完全是一个 不同的事情。这导致所谓的扩展EntityManager,这不是 线程安全,因此不得在并发访问的组件中使用,例如 Spring 管理的单例 bean。扩展EntityManager实例只应该被使用 例如,在驻留在会话中的有状态组件中,具有EntityManager不与当前交易绑定,而是完全取决于 应用。spring-doc.cadn.net.cn

方法级和现场级进样

您可以应用指示依赖项注入的注释(例如@PersistenceUnit@PersistenceContext) 在类内的字段或方法上——因此表达式 “方法级注入”和“字段级注入”。字段级注释是 简洁且易于使用,而方法级注释允许进一步处理 注入依赖关系。在这两种情况下,成员可见性(公共、受保护或私有) 没关系。spring-doc.cadn.net.cn

类级注释呢?spring-doc.cadn.net.cn

在 Jakarta EE 平台上,它们用于依赖声明,而不是资源 注射。spring-doc.cadn.net.cn

注射的EntityManager是 Spring 管理的(知道正在进行的事务)。 尽管新的 DAO 实现使用方法级注入EntityManager而不是EntityManagerFactory,则不需要在 bean 定义中进行更改 由于注释的使用。spring-doc.cadn.net.cn

这种 DAO 风格的主要优点是它仅依赖于 Java Persistence API。 不需要导入任何 Spring 类。此外,正如 JPA 注释所理解的那样, 注射由弹簧容器自动应用。这是有吸引力的 非侵入性的视角,对 JPA 开发人员来说感觉更自然。spring-doc.cadn.net.cn

实施基于@Autowired(通常使用基于构造函数的注入)

@PersistenceUnit@PersistenceContext只能在方法和字段上声明。 通过构造函数和其他方式提供 JPA 资源怎么样@Autowired注射点?spring-doc.cadn.net.cn

EntityManagerFactory可以通过构造函数轻松注入,并且@Autowired字段/方法 只要目标被定义为 bean,例如,通过LocalContainerEntityManagerFactoryBean. 注射点与原始点匹配EntityManagerFactory按类型按原样定义。spring-doc.cadn.net.cn

但是,一个@PersistenceContext-风格共享EntityManager参考不适用于 开箱即用的定期依赖注入。为了使其可用于基于类型的 根据要求进行匹配@Autowired,请考虑定义一个SharedEntityManagerBean作为您的伴侣EntityManagerFactory定义:spring-doc.cadn.net.cn

<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
	...
</bean>

<bean id="em" class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
	<property name="entityManagerFactory" ref="emf"/>
</bean>

或者,您可以定义一个@Bean基于的方法SharedEntityManagerCreator:spring-doc.cadn.net.cn

@Bean("em")
public static EntityManager sharedEntityManager(EntityManagerFactory emf) {
	return SharedEntityManagerCreator.createSharedEntityManager(emf);
}

如果存在多个持久性单元,则每个EntityManagerFactory定义需要伴随着相应的EntityManagerbean 定义,最好使用限定符与 distinct 匹配EntityManagerFactory定义,以便区分持久性单元通过@Autowired @Qualifier("…​").spring-doc.cadn.net.cn

Spring 驱动的 JPA 事务

我们强烈建议您阅读声明式事务管理,如果您还没有这样做,以更详细地了解 Spring 的声明式事务支持。

JPA 的推荐策略是通过 JPA 的本机事务进行本地事务 支持。Spring的JpaTransactionManager提供了许多本地已知的功能 JDBC 事务(例如特定于事务的隔离级别和资源级别 只读优化)针对任何常规 JDBC 连接池,而无需 JTA 事务协调器和支持 XA 的资源。spring-doc.cadn.net.cn

Spring JPA 还允许配置的JpaTransactionManager公开 JPA 事务 到 JDBC 访问代码,该代码访问相同的DataSource,前提是注册的JpaDialect支持检索底层 JDBCConnection.Spring 提供 EclipseLink 和 Hibernate JPA 实现的方言。有关详细信息,请参阅下一节JpaDialect.spring-doc.cadn.net.cn

对于 JTA 风格的实际资源连接的延迟检索,Spring 提供了一个 相应DataSource目标连接池的代理类:请参阅LazyConnectionDataSourceProxy. 这对于 JPA 只读事务特别有用,因为 JPA 只读事务通常可以 从本地缓存处理,而不是访问数据库。spring-doc.cadn.net.cn

理解JpaDialectJpaVendorAdapter

作为一项高级功能,JpaTransactionManagerAbstractEntityManagerFactoryBean允许自定义JpaDialect传递给jpaDialectbean 属性。一个JpaDialect实现可以启用以下高级 Spring 支持的功能,通常以特定于提供商的方式:spring-doc.cadn.net.cn

这对于特殊事务语义和高级 例外的翻译。默认实现 (DefaultJpaDialect) 会 不提供任何特殊能力,如果需要前面列出的功能,则有 以指定适当的方言。spring-doc.cadn.net.cn

作为一个更广泛的提供商适配设施,主要针对 Spring 的全功能LocalContainerEntityManagerFactoryBean设置JpaVendorAdapter将 能力JpaDialect与其他特定于提供程序的默认值。指定HibernateJpaVendorAdapterEclipseLinkJpaVendorAdapter最方便 自动配置EntityManagerFactoryHibernate 或 EclipseLink 的设置, 分别。请注意,这些提供程序适配器主要设计用于 Spring 驱动的事务管理(即,用于JpaTransactionManager).

请参阅JpaDialectJpaVendorAdapterjavadoc 的 有关其作以及如何在 Spring 的 JPA 支持中使用它们的更多详细信息。spring-doc.cadn.net.cn

使用 JTA 事务管理设置 JPA

作为替代方案JpaTransactionManager,Spring 还允许多资源 通过 JTA 进行事务协调,无论是在 Jakarta EE 环境中还是在 独立事务协调器,例如 Atomikos。除了选择 Spring 的JtaTransactionManager而不是JpaTransactionManager,你需要更进一步 步骤:spring-doc.cadn.net.cn

  • 底层 JDBC 连接池需要支持 XA 并与 您的交易协调员。这在雅加达 EE 环境中通常很简单, 暴露一种不同类型的DataSource通过 JNDI。查看您的应用程序服务器 文档了解详细信息。类似地,独立事务协调器通常 带有特殊的 XA 集成DataSource变种。再次检查其文档。spring-doc.cadn.net.cn

  • 太平绅士协会EntityManagerFactory需要为 JTA 配置设置。这是 provider-specific 的,通常通过指定为jpaPropertiesLocalContainerEntityManagerFactoryBean.对于 Hibernate,这些属性 甚至是特定于版本的。有关详细信息,请参阅您的 Hibernate 文档。spring-doc.cadn.net.cn

  • Spring的HibernateJpaVendorAdapter强制执行某些面向 Spring 的默认值,例如 作为连接释放方式,on-close,它与 Hibernate 自己的默认值 Hibernate 5.0,但在 Hibernate 5.1+ 中不再如此。对于 JTA 设置,请确保声明 持久性单元事务类型为“JTA”。或者,将 Hibernate 5.2 的hibernate.connection.handling_mode属性设置为DELAYED_ACQUISITION_AND_RELEASE_AFTER_STATEMENT恢复 Hibernate 自己的默认值。 有关相关说明,请参阅 Spurious Application Server Warnings with Hibernatespring-doc.cadn.net.cn

  • 或者,考虑获取EntityManagerFactory从您的应用程序 服务器本身(即,通过 JNDI 查找而不是本地声明的LocalContainerEntityManagerFactoryBean).服务器提供的EntityManagerFactory可能需要在服务器配置中进行特殊定义(使部署 可移植性较差),但针对服务器的 JTA 环境进行了设置。spring-doc.cadn.net.cn

用于 JPA 交互的本机休眠设置和本机休眠事务

一个本地人LocalSessionFactoryBean设置与HibernateTransactionManager允许与@PersistenceContext和其他 JPA 访问代码。A 休眠SessionFactory原生实现 JPA 的EntityManagerFactory现在界面 和 HibernateSessionhandle 本地是 JPAEntityManager. Spring 的 JPA 支持工具会自动检测本机 Hibernate 会话。spring-doc.cadn.net.cn

因此,这种本机 Hibernate 设置可以替代标准 JPALocalContainerEntityManagerFactoryBeanJpaTransactionManager组合 在许多情况下,允许与SessionFactory.getCurrentSession()(并且还HibernateTemplate) 旁边@PersistenceContext EntityManager在 相同的本地事务。这样的设置还提供了更强大的 Hibernate 集成 以及更大的配置灵活性,因为它不受 JPA 引导合约的约束。spring-doc.cadn.net.cn

您不需要HibernateJpaVendorAdapter配置, 由于 Spring 的原生 Hibernate 设置提供了更多功能 (例如,自定义 Hibernate Integrator 设置、Hibernate 5.3 Bean 容器集成、 以及对只读事务的更强优化)。最后但并非最不重要的一点是,您还可以 express native Hibernate 设置LocalSessionFactoryBuilder, 无缝集成@Bean样式配置(否FactoryBean涉及)。spring-doc.cadn.net.cn

LocalSessionFactoryBeanLocalSessionFactoryBuilder支持背景 引导,就像 JPA 一样LocalContainerEntityManagerFactoryBean确实。 有关介绍,请参阅后台引导。spring-doc.cadn.net.cn

LocalSessionFactoryBean,这可以通过bootstrapExecutor财产。在程序化LocalSessionFactoryBuilder,一个重载的buildSessionFactory方法采用 bootstrap executor 参数。spring-doc.cadn.net.cn