Spring boot java.lang.IllegalStateException:不允许在共享EntityManager上创建事务-请改用Spring事务或EJB CMT
伙计们。我想在Hibernate搜索的帮助下在我的Spring Boot应用程序中创建全文搜索。我遇到了这样一个异常:java.lang.IllegalStateException:不允许在共享EntityManager上创建事务-请改用Spring事务或EJB CMT。它是在线的Spring boot java.lang.IllegalStateException:不允许在共享EntityManager上创建事务-请改用Spring事务或EJB CMT,spring-boot,lucene,hibernate-search,Spring Boot,Lucene,Hibernate Search,伙计们。我想在Hibernate搜索的帮助下在我的Spring Boot应用程序中创建全文搜索。我遇到了这样一个异常:java.lang.IllegalStateException:不允许在共享EntityManager上创建事务-请改用Spring事务或EJB CMT。它是在线的 entityManager.getTransaction().begin(); 这是我的密码 @Repository public class HibernateSearch { @PersistenceCon
entityManager.getTransaction().begin();
这是我的密码
@Repository
public class HibernateSearch {
@PersistenceContext
private EntityManager entityManager;
@Transactional
public List<Manual> fulltextSearching(String keyword){
FullTextEntityManager fullTextEntityManager =
org.hibernate.search.jpa.Search.getFullTextEntityManager(entityManager);
entityManager.getTransaction().begin();
QueryBuilder qb = fullTextEntityManager.getSearchFactory()
.buildQueryBuilder().forEntity(Manual.class).get();
org.apache.lucene.search.Query luceneQuery = qb
.keyword()
.onFields("name")
.matching(keyword)
.createQuery();
javax.persistence.Query jpaQuery =
fullTextEntityManager.createFullTextQuery(luceneQuery, Manual.class);
@SuppressWarnings("unchecked")
List<Manual> result = jpaQuery.getResultList();
entityManager.getTransaction().commit();
entityManager.close();
return result;
}
我的财产:
spring.jpa.properties.hibernate.search.default.directory_provider = filesystem
spring.jpa.properties.hibernate.search.default.indexBase = D:\\Java
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
我的Maven依赖项:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-search-orm</artifactId>
<version>5.7.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
</dependency>
org.hibernate
休眠搜索orm
5.7.1.最终版本
org.hibernate
休眠实体管理器
如果你需要更多的信息来回答我的问题,说吧,我会补充。我搜索了网络,但仍然找不到答案。
如果您能解决我的问题,我将非常高兴。也许您应该从
entityManager工厂获得entityManager
:
@Autowired
private EntityManagerFactory emf;
...
EntityManager entityManager = emf.createEntityManager();
也许您应该从entityManager工厂
获取entityManager
:
@Autowired
private EntityManagerFactory emf;
...
EntityManager entityManager = emf.createEntityManager();
也许您应该使用javax.transaction包中的@Transactional
注释
适合我。也许你应该使用javax.transaction包中的@Transactional
注释
适用于我。删除交易代码。Spring已经管理了您的事务和实体管理器。..。@M.Deinum我尝试过它,但当我删除事务代码时,luceneQuery的创建会抛出NPE。org.apache.lucene.search.Query luceneQuery=qb.keyword().onFields(“name”).matching(keyword.createQuery();这就是为什么我有点困惑,然后你有一个不同的问题,但你现在正在与Spring竞争事务。解决方案不是启动事务,而是在别处。删除事务代码并重写您的问题,这样我们就可以帮助修复NullPointerException
。可能的重复项我也有同样的问题,并且我尝试使用Spring和javax中的事务,这两种方法都没有帮助@这不是关于lucene,而是关于Spring+hibernate。完全不同的问题。请删除事务代码。Spring已经管理了您的事务和实体管理器。..。@M.Deinum我尝试过它,但当我删除事务代码时,luceneQuery的创建会抛出NPE。org.apache.lucene.search.Query luceneQuery=qb.keyword().onFields(“name”).matching(keyword.createQuery();这就是为什么我有点困惑,然后你有一个不同的问题,但你现在正在与Spring竞争事务。解决方案不是启动事务,而是在别处。删除事务代码并重写您的问题,这样我们就可以帮助修复NullPointerException
。可能的重复项我也有同样的问题,并且我尝试使用Spring和javax中的事务,这两种方法都没有帮助@这不是关于lucene,而是关于Spring+hibernate。完全不同的问题。消息说不要使用它,但解决方法是使用它代替?够疯狂的了。但是没有帮助我。我几乎可以肯定,你改变了一些别的东西,但没有注意到。其他更改可能非常有价值。@Gangnus您应该只使用@Transactional
并删除对getTransaction().begin()
的调用。事务应该由Spring管理,而不是由您手动管理。如果您确实需要手动管理事务(经常发生,但应该很少),请查看TransactionTemplates。不,@yrodiere,我已经找到了解决该问题的方法。以及stackoverflow.com/a/30349784/715269,问答。然而,这篇文章应该是评论,或者干脆不应该。(我也为此浪费了大约30分钟)信息上说不要使用它,但解决办法是改用它?够疯狂的了。但是没有帮助我。我几乎可以肯定,你改变了一些别的东西,但没有注意到。其他更改可能非常有价值。@Gangnus您应该只使用@Transactional
并删除对getTransaction().begin()
的调用。事务应该由Spring管理,而不是由您手动管理。如果您确实需要手动管理事务(经常发生,但应该很少),请查看TransactionTemplates。不,@yrodiere,我已经找到了解决该问题的方法。以及stackoverflow.com/a/30349784/715269,问答。然而,这篇文章应该是评论,或者干脆不应该。(我也为此浪费了大约30分钟)