Java 我在任何spring组件中都可以得到哪个EntityManager副本?
在应用程序启动过程中,我正在逐步执行我的hibernate初始化代码,我可以看到它有3个观察器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组件中,下
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
实例的交互都没有什么不同。它是一个完全兼容的JPAEntityManager
实例
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,它们确实会定期更改,但在不同版本之间更改的可能性远远小于内部类