java.lang.IllegalStateException:不允许在共享 EntityManager 上创建事务 - 请改用 Spring 事务或 EJB CMT

And*_*310 2 lucene hibernate-search spring-boot

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

entityManager.getTransaction().begin();
Run Code Online (Sandbox Code Playgroud)

这是我的代码

@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;
}
Run Code Online (Sandbox Code Playgroud)

}

我的实体:

@Entity
@Table(name = "manual")
@Getter
@Setter
@NoArgsConstructor
@Indexed
public class Manual {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name = "manual_id")
  private Long id;

  @NotNull
  @Column(name = "manual_name")
  @Field
  private String name;
}
Run Code Online (Sandbox Code Playgroud)

我的属性:

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
Run Code Online (Sandbox Code Playgroud)

我的 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>
Run Code Online (Sandbox Code Playgroud)

如果您需要其他信息来回答我的问题,请说出来,我会添加它。我在网上搜索但仍然找不到答案。如果您能解决我的问题,我将非常高兴。

小智 7

也许你应该entityManagerEntityManagerFactory

@Autowired
private EntityManagerFactory emf;
...
EntityManager entityManager = emf.createEntityManager();
Run Code Online (Sandbox Code Playgroud)