Java 我在任何spring组件中都可以得到哪个EntityManager副本?

Java 我在任何spring组件中都可以得到哪个EntityManager副本?,java,spring,hibernate,spring-mvc,Java,Spring,Hibernate,Spring Mvc,在应用程序启动过程中,我正在逐步执行我的hibernate初始化代码,我可以看到它有3个观察器 0 = {EntityManagerFactoryBuilderImpl$ServiceRegistryCloser@6990} 1 = {SessionFactoryImpl$1IntegratorObserver@7021} 2 = {HibernateSearchSessionFactoryObserver@7105} 但是,在方法标记为@Transactional的spring组件中,下

在应用程序启动过程中,我正在逐步执行我的hibernate初始化代码,我可以看到它有3个观察器

0 = {EntityManagerFactoryBuilderImpl$ServiceRegistryCloser@6990} 
1 = {SessionFactoryImpl$1IntegratorObserver@7021} 
2 = {HibernateSearchSessionFactoryObserver@7105}
但是,在方法标记为@Transactional的spring组件中,下面的代码只显示EntityManagerFactoryBuilderImpl$ServiceRegistryCloser,即上面列表中的第一个观察者

@PersistenceContext
    private EntityManager entityManager;

    @Override
    @Transactional
    public boolean init() throws MigrationCheckException
    {

        HibernateEntityManagerFactory hemf = (HibernateEntityManagerFactory)entityManager.getEntityManagerFactory();
        SessionFactoryObserver[] observers = hemf.getSessionFactory().getSessionFactoryOptions().getSessionFactoryObservers();

        SessionFactoryImplementor simf =  (SessionFactoryImplementor) hemf.getSessionFactory();
        observers = simf.getSessionFactoryOptions().getSessionFactoryObservers();
知道为什么吗?我是否得到EntityManager的代理、有限版本?我看到spring代码在启动时创建了一个nativeEntityManagerFactory,这与上述情况有什么关系

我的目标是访问hibernate搜索索引管理器并获得每个索引的目录,代码如下

    for (IndexManager indexManager : indexManagerHolder.getIndexManagers())
    {
        DirectoryBasedIndexManager directoryBasedIndexManager = (DirectoryBasedIndexManager)indexManager;
        directoryBasedIndexManager.getDirectoryProvider().getDirectory();
        FSDirectory dir = (FSDirectory)directoryBasedIndexManager.getDirectoryProvider().getDirectory();
        if (Files.exists(dir.getDirectory()))
        {

但是我不确定如何从spring组件到达IndexManager文件夹,我不一定关心您看到的创建的各种观察者。其中一些可以静态初始化,而另一些则始终为每个工厂初始化

从代码的角度来看,Spring可以将
EntityManager
属性设置为持久性提供程序提供给它的实例,也可以用自己的实例包装持久性提供程序实例,以完成各种Spring任务,这取决于他们

无论spring做什么,您与该
EntityManager
实例的交互都没有什么不同。它是一个完全兼容的JPA
EntityManager
实例

FullTextEntityManager ftEntityManager = Search.getFullTextEntityManager( em );
SearchFactory searchFactory = ftEntityManager.getSearchFactory();

// get the integrator from the search factory
SearchIntegator integrator = searchFactory.unwrap( SearchIntegrator.class );
for ( Class<?> indexType : integrator.getIndexedTypes() ) {
   EntityIndexBinding binding = integrator.getIndexBinding( indexType );
   for( IndexManager indexManager : binding.getIndexManagers() ) {
     // do whatever you need here
   }
}
根据我过去使用Hibernate搜索的经验,只需将该实例提供给相应的
Search
静态方法,即可获得
FullTextEntityManager
实例

FullTextEntityManager ftEntityManager = Search.getFullTextEntityManager( em );
SearchFactory searchFactory = ftEntityManager.getSearchFactory();

// get the integrator from the search factory
SearchIntegator integrator = searchFactory.unwrap( SearchIntegrator.class );
for ( Class<?> indexType : integrator.getIndexedTypes() ) {
   EntityIndexBinding binding = integrator.getIndexBinding( indexType );
   for( IndexManager indexManager : binding.getIndexManagers() ) {
     // do whatever you need here
   }
}
FullTextEntityManager ftEntityManager=Search.getFullTextEntityManager(em);
SearchFactory SearchFactory=ftEntityManager.getSearchFactory();
//从搜索工厂获取集成器
SearchIntegrator integrator=searchFactory.unwrap(SearchIntegrator.class);
对于(类indexType:integrator.getIndexedTypes()){
EntityIndexBinding绑定=integrator.getIndexBinding(indexType);
for(IndexManager IndexManager:binding.getIndexManagers()){
//你需要什么就做什么
}
}
通过尝试访问
IndexManagerHolder
或使用
ExtendedSearchIntegrator
,您可以开始深入访问不打算公开的内部类。上面的代码使用公开的SPI,它们确实会定期更改,但在不同版本之间更改的可能性远远小于内部类