Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate搜索和JPA与JTA事务_Hibernate_Jakarta Ee_Jpa - Fatal编程技术网

Hibernate搜索和JPA与JTA事务

Hibernate搜索和JPA与JTA事务,hibernate,jakarta-ee,jpa,Hibernate,Jakarta Ee,Jpa,我想使用Hibernate搜索全文搜索功能。我有一个简单的JavaEE应用程序。我对实体类进行了注释,下面是我的persistence.xml: <persistence-unit name="library"> <jta-data-source>jdbc/webrarydb</jta-data-source> <class>net.hcpeter.webrary.entities.Author</class>

我想使用Hibernate搜索全文搜索功能。我有一个简单的JavaEE应用程序。我对实体类进行了注释,下面是我的persistence.xml:

<persistence-unit name="library">
    <jta-data-source>jdbc/webrarydb</jta-data-source>
    <class>net.hcpeter.webrary.entities.Author</class>
    <class>net.hcpeter.webrary.entities.Book</class>
    <class>net.hcpeter.webrary.entities.Request</class>
    <class>net.hcpeter.webrary.entities.User</class>

    <properties>
        <property name="hibernate.search.default.directory_provider" value="org.hibernate.search.store.FSDirectoryProvider"/>
        <property name="hibernate.search.indexing_strategy" value="manual"/>
        <property name="hibernate.search.default.indexBase" value="/Users/hcpeter/Documents/workspace/indexes"/>
        <property name="hibernate.current_session_context_class" value="org.hibernate.context.JTASessionContext"/>
    </properties>
</persistence-unit>

jdbc/webrarydb
net.hcpeter.webrary.entities.Author
net.hcpeter.webrary.entities.Book
net.hcpeter.webrary.entities.Request
net.hcpeter.webrary.entities.User
我试着这样搜索:

EntityManager em = authorFacade.getEntityManager();
        FullTextEntityManager ftem = org.hibernate.search.jpa.Search.getFullTextEntityManager(em);

        ftem.getTransaction().begin();
        QueryBuilder qb = ftem.getSearchFactory().buildQueryBuilder().forEntity(Author.class).get();
        org.apache.lucene.search.Query query = qb.keyword().onFields("firsName", "lastName").matching("Author#1").createQuery();

        javax.persistence.Query persistenceQuery = ftem.createFullTextQuery(query, Author.class);
        List<Author> result = persistenceQuery.getResultList();
        em.getTransaction().commit();
        em.close();
        for (Author author : result) {
            System.out.println(author.getLastName() + " " + author.getFirstName());
        }
        return result;
EntityManager em=authorFacade.getEntityManager();
FullTextEntityManager ftem=org.hibernate.search.jpa.search.getFullTextEntityManager(em);
ftem.getTransaction().begin();
QueryBuilder qb=ftem.getSearchFactory().buildQueryBuilder().forEntity(Author.class.get();
org.apache.lucene.search.Query Query=qb.keyword().onFields(“firsName”、“lastName”).matching(“Author#1”).createQuery();
javax.persistence.Query persistenceQuery=ftem.createFullTextQuery(Query,Author.class);
List result=persistenceQuery.getResultList();
em.getTransaction().commit();
em.close();
for(作者:结果){
System.out.println(author.getLastName()+“”+author.getFirstName());
}
返回结果;
然后我给出了在使用JTA时不能使用EntityTransaction。
因此,我的问题是如何将hibernate搜索与JTA结合使用?

您已经配置了JTA数据源(与非JTA数据源相比)。因此,最有可能的情况是authorFacade.getEntityManager()返回使用JTA事务的EntityManager。现在您有了EntityManager,它可以处理您手中的JTA事务。将其作为参数传递给getFullTextEntityManager。可能是ftem.getTransaction().begin() 只需将调用传递给原始(JTA)EntityManager。那么您就有问题了,因为getTransaction应该只在您使用应用程序管理的事务时使用,并且一个EntityManager不会处理两种类型的事务

你的选择是:

  • 如果您对JTA事务感到满意,只需像使用一样使用它们 其他地方也有。我看不出使用它有什么特别之处 使用Hibernate搜索将其删除。如果你根本不知道JTA 事务(现在不想学习它们),并且希望大致相同 事务行为与现在的代码一样,使用 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)和 从代码中删除事务处理
  • 配置非jta数据源并使用它

  • 我想使用JTA事务。但是如何使用lucene查询呢?我需要QueryBuilder当来自EntityManager时,它不是FullTextEntityManager。当我尝试获取fullTextEntityManager时,我得到
    尝试在没有Hibernate EntityManager的情况下使用Hibernate搜索。到目前为止,我还没有找到一个例子……那么除了Hibernate之外,您还使用其他JPA实现吗?哪个应用服务器?我可以看到,您没有在persistence.xml中定义提供程序,因此它将是应用程序服务器中的默认提供程序。如果您想确定它是Hibernate,那么您必须添加org.Hibernate.ejb.HibernatePersistence,如下所述:不,我将Hibernate与glassfish 3.1一起使用。我使用javax.persistence.criteria.CriteriaQuery和CriteriaBuilder构建查询,但Glasshfish中的默认值是EclipseLink,正如我链接的页面上所述。如果未定义提供程序,则它不能是Hibernate。通过为实体管理器打印getClass(),可以快速检查哪个实现正在使用。如果是Hibernate,输出应该是:org.Hibernate.ejb.EntityManagerImplOhh,我真是个白痴。。。后来我更改了persistence.xml,忘记了定义提供程序。我只是意识到有些例外包含日食。。。我会这样试试,非常感谢!