[英]hibernate with lucene search index files are not created: IndexWriterConfig.setWriteLockTimeout(J)Lorg/apache/lucene/index/IndexWriterConfig;
我有一个小项目,我想与 lucene 和 hibernate 集成:这是 bean 文件:package com.domain.java;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import org.hibernate.search.annotations.Analyzer;
import org.hibernate.search.annotations.DocumentId;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.annotations.Store;
@Entity
@Indexed
@Analyzer(impl = org.apache.lucene.analysis.standard.StandardAnalyzer.class)
public class TempFile {
@Field(store = Store.YES)
private String iconName;
@Field(store = Store.YES)
private String name;
@Id
@DocumentId
@Field(store = Store.YES)
private String path;
@Field(store = Store.YES)
private boolean mightHaveThumbnail;
@Field(store = Store.YES)
private boolean folder;
@Field(store = Store.YES)
private boolean file;
public String getIconName() {
return iconName;
}
public String getName() {
return name;
}
public String getPath() {
return path;
}
public boolean isMightHaveThumbnail() {
return mightHaveThumbnail;
}
public boolean isFolder() {
return folder;
}
public boolean isFile() {
return file;
}
public void setIconName(String iconName) {
this.iconName = iconName;
}
public void setName(String name) {
this.name = name;
}
public void setPath(String path) {
this.path = path;
}
public void setMightHaveThumbnail(boolean mightHaveThumbnail) {
this.mightHaveThumbnail = mightHaveThumbnail;
}
public void setFolder(boolean folder) {
this.folder = folder;
}
public void setFile(boolean file) {
this.file = file;
}
}
这是休眠文件:
package com.domain.java;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.Enumeration;
import java.util.List;
import java.util.Properties;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
import org.hibernate.service.ServiceRegistry;
public class HibernateTest {
public static void main(String[] args) {
TempFile mm = new TempFile();
mm.setFile(true);
mm.setPath("patdsaasdsadahswdsaaad "+new Date());
mm.setName("nasdasassadasaeeassaaasddas "+new Date());
Properties properties = new Properties();
try {
properties.load(new FileInputStream("./resources/postgres/hibernate.properties"));
// readAPropertyFile("./resources/postgres/hibernate.properties");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Configuration configuration = new Configuration();
File file = new File("./resources/postgres/hibernate.cfg.xml");
System.out.println(file.exists());
configuration.mergeProperties(properties);
configuration.configure(file);
configuration.addAnnotatedClass(TempFile.class);
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
Session session = sessionFactory.openSession();
session.beginTransaction();
FullTextSession fullTextSession = Search.getFullTextSession(session);
try {
fullTextSession.createIndexer().startAndWait();
fullTextSession.beginTransaction();
fullTextSession.close();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// session.save(mm);
// session.getTransaction().commit();
session.close();
// now lets pull events from the database and list them
session = sessionFactory.openSession();
session.beginTransaction();
List result = session.createQuery("from TempFile").list();
for ( TempFile event : (List<TempFile>) result ) {
System.out.println( "Event (" + event.getPath() + ") : " + event.getPath() );
System.out.println( "Event (" + event.getName() + ") : " + event.getName() );
}
session.getTransaction().commit();
session.close();
}
private static void readAPropertyFile(String propertiesFilePath) {
Properties prop = new Properties();
InputStream input = null;
try {
input = new FileInputStream(propertiesFilePath);
// load a properties file
prop.load(input);
// get the property value and print it out
Enumeration<?> e = prop.propertyNames();
while (e.hasMoreElements()) {
String key = (String) e.nextElement();
String value = prop.getProperty(key);
System.out.println("Key : " + key + ", Value : " + value);
}
} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (input != null) {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
配置文件:
<?xml version='1.0' encoding='utf-8'?>
<!--
~ Hibernate, Relational Persistence for Idiomatic Java
~
~ License: GNU Lesser General Public License (LGPL), version 2.1 or later.
~ See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
-->
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<!-- <property name="connection.driver_class">org.hsqldb.jdbcDriver</property>
<property name="connection.url">jdbc:hsqldb:hsql://localhost/TestDB</property> -->
<!-- Echo all executed SQL to stdout -->
<!-- >property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<property name="current_session_context_class">thread</property>
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<property name="hibernate.search.default.directory_provider">filesystem</property>
-->
<!--
< Enable Hibernate's automatic session context management >
<property name="current_session_context_class">thread</property>
<property name="cache.use_query_cache">true</property>
<property name="cache.use_second_level_cache">true</property>
<property name="cache.use_structured_entries">true</property>
<property name="cache.region.factory_class">org.hibernate.cache.EhCacheRegionFactory</property>
<property name="net.sf.ehcache.configurationResourceName">/hibernate-config/ehcache.xml</property>
mapping resource="hibernate-config/domain/Event.hbm.xml"/>
<mapping resource="hibernate-config/domain/Person.hbm.xml"/>
<mapping resource="hibernate-config/domain/PhoneNumber.hbm.xml"/>
<mapping resource="hibernate-config/domain/Account.hbm.xml"/>
<mapping resource="hibernate-config/domain/HolidayCalendar.hbm.xml"/>
<mapping resource="hibernate-config/domain/Item.hbm.xml"/-->
<!--
<mapping class="com.domain.java.TempFile"/>
org.hibernate.search.store.impl.RAMDirectoryProvider
-->
<!-- Would set this in production application. Index stored on disk. -->
<property name="hibernate.search.default.directory_provider">
org.hibernate.search.store.impl.FSDirectoryProvider
</property>
<property name="hibernate.search.default.indexBase">c:\aatemp\lucene\indexes</property>
</session-factory>
</hibernate-configuration>
属性文件
######################
### Query Language ###
######################
## define query language constants / function names
hibernate.query.substitutions yes 'Y', no 'N'
## select the classic query parser
#hibernate.query.factory_class org.hibernate.hql.internal.classic.ClassicQueryTranslatorFactory
#################
### Platforms ###
#################
## JNDI Datasource
#hibernate.connection.datasource jdbc/test
#hibernate.connection.username db2
#hibernate.connection.password db2
## PostgreSQL
hibernate.dialect org.hibernate.dialect.PostgreSQLDialect
hibernate.connection.driver_class org.postgresql.Driver
hibernate.connection.url jdbc:postgresql://localhost:5432/hibernatedb
hibernate.connection.username postgres
hibernate.connection.password xxxxxxxx
hibernate.hbm2ddl.auto=update
show_sql=true
#Lucene
hibernate.search.default.directory_provider filesystem
hibernate.search.default.indexBase c:/var/lucene/indexes
hibernate.search.default.locking_strategy simple
我在运行上述代码时遇到以下异常:
2016 年 5 月 27 日上午 6:39:19 org.hibernate.Version logVersion 信息:HHH000412:Hibernate Core {5.1.0.Final} 2016 年 5 月 27 日上午 6:39:19 org.hibernate.cfg.Environment INFO:HH60:HHH0找不到 hibernate.properties 2016 年 5 月 27 日上午 6:39:19 org.hibernate.cfg.Environment buildBytecodeProvider INFO:HHH000021:字节码提供程序名称:javassist true 2016 年 5 月 27 日上午 6:39:19 boot.hibernate .internal.stax.LocalXmlResourceResolver resolveEntity WARN:HHH90000012:已识别过时的休眠命名空间http://hibernate.sourceforge.net/hibernate-configuration 。 改用命名空间http://www.hibernate.org/dtd/hibernate-configuration 。 可以随时删除对过时 DTD/XSD 名称空间的支持。 2016 年 5 月 27 日上午 6:39:19 org.hibernate.annotations.common.reflection.java.JavaReflectionManager 信息:HCANN000001:Hibernate Commons Annotations {5.0.1.Final} 2016 年 5 月 27 日上午 6:39:19 org.hiber .engine.jdbc.connections.internal.ConnectionProviderInitiator instantiateProxoolProvider WARN: HHH000209: 遇到了proxool 属性,但是在类路径上找不到proxool 提供程序类; 这些属性将被忽略。 2016 年 5 月 27 日上午 6:39:19 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl 配置警告:HHH10001002:使用 Hibernate 内置连接池(不用于生产用途!)2016 年 5 月 27 日 6:39:上午 19 点 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO:HHH10001005:使用驱动程序 [org.postgresql.Driver] 在 URL [jdbc:postgresql://localhost:5432/hibernatedb] 2016 年 5 月 27 日 6:上午 39:19 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO:HHH10001001:连接属性:{user=postgres, password=****} 2016 年 5 月 27 日上午 6:39:19 org.hibernate .engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH10001003: Autocommit mode: false May 27, 2016 6:39:19 AM org.hibernate.engine.jdbc.connections.internal.PooledConnections INFO: HHH10001003 : 1 (min=1) 2016 年 5 月 27 日上午 6:39:19 org.hibernate.dialect.Dialect 信息:HHH0 00400:使用方言:org.hibernate.dialect.PostgreSQLDialect 2016 年 5 月 27 日上午 6:39:19 org.hibernate.engine.jdbc.env.internal.LobCreatorBuilderImpl useContextualLobCreation INFO:HHH000424:禁用方法创建上下文 LOB错误:java.lang.reflect.InvocationTargetException 2016 年 5 月 27 日上午 6:39:19 org.hibernate.type.BasicTypeRegistry 注册信息:HHH000270:类型注册 [java.util.UUID] 覆盖以前的:org.hibernate.type.UUIDBinaryType @10aa41f2 2016 年 5 月 27 日上午 6:39:19 org.hibernate.envers.boot.internal.EnversServiceImpl 配置信息:Envers 集成已启用? :真 2016 年 5 月 27 日上午 6:39:20 org.hibernate.search.engine.Version 信息:HSEARCH000034:Hibernate Search 5.5.2.Final 2016 年 5 月 27 日上午 6:39:20 org.hibernate.engine.jdbc。 connection.internal.DriverManagerConnectionProviderImpl 停止信息:HHH10001008:清理连接池 [jdbc:postgresql://localhost:5432/hibernatedb] 线程“main”中的异常 java.lang.NoSuchMethodError: org.apache.lucene.index.IndexWriterConfig.setWriteLockTimeout (J)lorg/apache/lucene/index/IndexWriterConfig; 在 org.hibernate.search.store.spi.DirectoryHelper.initializeIndexIfNeeded(DirectoryHelper.java:57) 在 org.hibernate.search.store.impl.DirectoryProviderHelper.createFSIndex(DirectoryProviderHelper.java:128) 在 org.hibernate.search.store .impl.FSDirectoryProvider.initialize(FSDirectoryProvider.java:53) at org.hibernate.search.store.spi.BaseDirectoryProviderService.initialize(BaseDirectoryProviderService.java:64) at org.hibernate.search.store.spi.BaseDirectoryProviderService.create(BaseDirectoryProviderService) .java:52) 在 org.hibernate.search.indexes.spi.DirectoryBasedIndexManager.createDirectoryProvider(DirectoryBasedIndexManager.java:230) 在 org.hibernate.search.indexes.spi.DirectoryBasedIndexManager.initialize(DirectoryBasedIndexManager.java:90) 在 org. hibernate.search.indexes.impl.IndexManagerHolder.createIndexManager(IndexManagerHolder.java:256) at org.hibernate.search.indexes.impl.IndexManagerHolder.createIndexManager(IndexManagerHolder.java:513) at org.hibernate.search.indexes.impl。 IndexManagerHolder.createIndexManagers(IndexManagerHolder.java:482) at org.hibernate.search.indexes.impl.IndexManagerHolder.buildEntityIndexBinding(IndexManagerHolder.java:91) at org.hibernate.search.spi.SearchIntegratorBuilder.initDocumentBuilders(SearchIntegratorBuilder.java:358)在 org.hibernate.search.spi.SearchIntegratorBuilder.buildNewSearchFactory(SearchIntegratorBuilder.java:199) 在 org.hibernate.search.spi.SearchIntegratorBuilder.buildSearchIntegrator(SearchIntegratorBuilder.java:117) 在 org.hibernate.search.hcore.impl.HibernateSearchSessionFactoryObserver .sessionFactoryCreated(HibernateSearchSessionFactoryObserver.java:75) 在 org.hibernate.internal.SessionFactoryObserverChain.sessionFactoryCreated(SessionFactoryObserverChain.java:35) 在 org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:520) 在 org.hibernate.boot.boot. .SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:465) 在 org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.jav) a:708) 在 com.domain.java.HibernateTest.main(HibernateTest.java:48)
com.domain.java.TempFile 文件夹是在 lucene 索引路径中创建的,但是该文件夹是空的,并且上面的异常是 trowed。
真正的问题在这里:org.apache.lucene.index.IndexWriterConfig.setWriteLockTimeout(J)Lorg/apache/lucene/index/IndexWriterConfig;
您有一个依赖性问题:您使用的 Lucene 版本与您使用的 Hibernate Search 版本不兼容。
检查您的依赖项并修复它们,您的问题应该会消失。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.