gpt4 book ai didi

java - 为什么我可以在不定义持久性单元的情况下注入(inject)entityManager?

转载 作者:太空宇宙 更新时间:2023-11-04 12:46:56 25 4
gpt4 key购买 nike

我能够在我的 Service 类中注入(inject) EntityManager 而无需定义任何持久性单元。

这是我的配置:

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>
<jpa:repositories base-package="com.example"></jpa:repositories>

在我的服务类中:

@PersistenceContext
private EntityManager entityManager;

// THIS WORKS!
final Session session = entityManager.unwrap(Session.class);

是因为 jpa:repositories 吗?

最佳答案

Spring ORM 包的 LocalContainerEntityManagerFactoryBean类使这成为可能。它使用DefaultPersistenceUnitManager类来构建 PersistenceUnitInfo 的实例然后可以将其提供给 PersistenceProvider类(class)createContainerEntityManagerFactory 。 Hibernate 实现了这个接口(interface),以便 Spring 可以创建 EntityMangerFactory 的实例类。

DefaultPersistenceUnitManager类是创建名为 default 的 persistenceUnit 的类。并找到通过类路径上的类的所有实体类。从 persistence.xml 获取的相同信息已采用类似的替代方法,无需物理 persistence.xml 文件。

最后 Spring 使用 JpaVendorAdapter配置为获取 JPA 提供程序特定的 EntityManagerFactory 实例。

Spring 数据 JPA 特定 <jpa:repositories base-package="...." />@EnableJpaRepositories用于扫描所有用@Repository注释的bean以提供动态查询和其他功能。这不是详尽的解释,但您会看到这种“魔法”是如何发生的。

您可以在 grepcode 上找到更多信息或下载源代码以探索更多内容。

关于java - 为什么我可以在不定义持久性单元的情况下注入(inject)entityManager?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36221022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com