我能够在不定义持久性单元

时间:2016-03-25 13:37:19

标签: java hibernate jpa

我可以在我的Service类中注入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:存储库?

1 个答案:

答案 0 :(得分:0)

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

JpaVendorAdapter类是创建名为default的persistenceUnit的类,它会查找通过类路径上的类的所有实体类。从persistence.xml获取的相同信息已经采用了这样的替代方法,而没有物理persistence.xml文件。

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

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

您可以在{{3}}上找到更多信息,或下载资源以了解详情。