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

伙计们。我想在Hibernate搜索的帮助下在我的Spring Boot应用程序中创建全文搜索。我遇到了这样一个异常:java.lang.IllegalStateException:不允许在共享EntityManager上创建事务-请改用Spring事务或EJB CMT。它是在线的

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分钟)