0

是否可以在没有 jpa 的情况下使用带有 hibernate 的 hibernate 搜索。我只使用 jpa 注释,但我不使用 entityManager。

在这种情况下,当我使用休眠会话在数据库中创建一个新对象时,休眠搜索如何能够知道他必须索引一个对象。

到目前为止,我只有一个名为“人”的实体。我将@indexed 添加到该实体中,现在我无法再更新数据库中的人员实体。在更新此实体的事务期间调用 session.flush 时出现异常。

多谢。


这是我到目前为止所做的,

我添加到hibernate.cfg.xml:

  <property name="hibernate.search.default.directory_provider">
  org.hibernate.search.store.FSDirectoryProvider
  </property>
  <property name="hibernate.search.default.indexBase">./lucene/indexes</property>
  <property name="hibernate.search.default.batch.merge_factor">10</property>
  <property name="hibernate.search.default.batch.max_buffered_docs">10</property>

    <event type="post-update">
        <listener class="org.hibernate.search.event.FullTextIndexEventListener"/>
    </event>
    <event type="post-insert">
        <listener class="org.hibernate.search.event.FullTextIndexEventListener"/>
    </event>
    <event type="post-delete">
        <listener class="org.hibernate.search.event.FullTextIndexEventListener"/>
    </event>

让我们假设以下“版本”实体:

@Entity
@Indexed(index="indexes/versions")
@Table(name="VERSIONS")
public class Version implements Serializable {

  @Id
  @DocumentId
  @GeneratedValue(strategy=GenerationType.AUTO)
  @Column(name="V_NO", length=10)
  private Integer valueNb;

  @Column(nullable=false)
  @Temporal(TemporalType.TIMESTAMP)
  private Date tstamp;

这是保存版本的方法:

  private Version performUpdateActualOnCreation(Session session, VersionedObject storedObject, String userId, String message) {
    // create new version
    Version version = new Version(userId, message);
    session.save(version);

    // update previous version do the object with the Next Value NB
    if (storedObject != null) {
      storedObject.setNextVersion(version);
      session.update(storedObject);
    } else {
      logger.error("Error: trying to update versioned object which has no previous version!!");
    }

    session.flush();

    return version;
  }

问题来自 session.flush(); 这是堆栈跟踪,但我看不到任何内容。:(我还可以看到索引文件是创建的“索引/版本”,但它是空的)

DEBUG 2010-11-02 17:26:33,368+0100 http-8889-Processor6 com.data.server.dao.impl.HibernateDao.rollbackTransaction(HibernateDao.java:104) Rolling back Hibernate transaction 
com.google.gwt.user.client.rpc.StatusCodeException: The call failed on the server; see server log for details
    at com.google.gwt.user.client.rpc.impl.RequestCallbackAdapter.onResponseReceived(RequestCallbackAdapter.java:192)
    at com.google.gwt.http.client.Request.fireOnResponseReceived(Request.java:287)
    at com.google.gwt.http.client.RequestBuilder$1.onReadyStateChange(RequestBuilder.java:393)
    at sun.reflect.GeneratedMethodAccessor50.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
    at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
    at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:157)
    at com.google.gwt.dev.shell.BrowserChannel.reactToMessagesWhileWaitingForReturn(BrowserChannel.java:1713)
    at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:165)
    at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:120)
    at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:507)
    at com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:264)
    at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91)
    at com.google.gwt.core.client.impl.Impl.apply(Impl.java)
    at com.google.gwt.core.client.impl.Impl.entry0(Impl.java:188)
    at sun.reflect.GeneratedMethodAccessor44.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
    at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
    at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:157)
    at com.google.gwt.dev.shell.BrowserChannel.reactToMessages(BrowserChannel.java:1668)
    at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:401)
    at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:222)
    at java.lang.Thread.run(Thread.java:619)
4

2 回答 2

1

根据休眠搜索文档

如果您直接使用 Hibernate,这可以在 hibernate.properties 或 hibernate.cfg.xml 中完成。如果您通过 JPA 使用 Hibernate,您还可以将属性添加到 persistence.xml。

无论哪种方式,您都可以使用 Hibernate Search。是否有必要使用 JPA 注释或者您可以切换到 Hibernate 注释?要获得有关您的异常的更多帮助,您应该发布堆栈跟踪。

于 2010-11-02T16:05:54.577 回答
0

我有更多信息......(+现在我使用休眠注释)

在日志中我可以看到:

[INFO] class org.hibernate.cfg.ExtendedMappings has interface org.hibernate 
.cfg.Mappings as super class 

我认为这与休眠搜索的版本不兼容。这是使用 Ivy 的依赖项

<dependency org="org.hibernate" name="hibernate-core" rev="3.3.2.GA" conf="runtime->default,optional;full->sources"/>
<dependency org="org.hibernate" name="hibernate-annotations" rev="3.4.0.GA" conf="runtime->default;full->sources"/>

<dependency org="org.hibernate" name="hibernate-search" rev="3.2.0.Final" conf="runtime->default,optional;full->sources">
   <exclude org="javax.jms" name="jms" />
</dependency>

我查看了hibernate Compatibility Matrix,我看到Hibernate-core.3.3.2 与Hibernate 3.1.x 是兼容的。我会得到以前的版本,看看会发生什么

于 2010-11-03T08:41:57.473 回答