ejbModule中的hibernate搜索错误
问题描述:
对于我的最终项目,我打算在ejb模块中实现hibernate搜索。 由于呼叫远程客户端索引我的数据库,我有以下exeption:org.hibernate.service.UnknownServiceException:ejbModule中的hibernate搜索错误
所致未知服务请求[org.hibernate.search.hcore.impl.SearchFactoryReference]
请找我下面的代码:
1.我的会话EJB:
import javax.annotation.PostConstruct;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import org.apache.lucene.search.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
import org.hibernate.search.query.dsl.QueryBuilder;
/**
* Session Bean implementation class HibernateIndexer
*/
@Stateless(name="HIND")
@LocalBean
public class HibernateIndexer implements HibernateIndexerRemote, HibernateIndexerLocal {
protected Configuration config;
protected SessionFactory sessionFactory;
protected Session session;
protected FullTextSession ftx;
/**
* Default constructor.
*/
public HibernateIndexer() {
// TODO Auto-generated constructor stub
}
@PostConstruct
private void init(){
config=new Configuration();
sessionFactory= config.configure().buildSessionFactory();
session=sessionFactory.openSession();
ftx=Search.getFullTextSession(session);
}
public void indexer(){
try {
ftx.createIndexer().startAndWait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
session.close();
}
}
2.我的EJB实体
2.1 TgPersonnePer.java
import org.hibernate.search.annotations.Analyze;
import org.hibernate.search.annotations.DocumentId;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Index;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.annotations.IndexedEmbedded;
import org.hibernate.search.annotations.Store;
@Indexed
public class TgPersonnePer implements java.io.Serializable {
@DocumentId
private String perId;
@IndexedEmbedded
private TgPersonneMoralePer tgPersonneMoralePer;
public TgPersonnePer() {
}
public TgPersonnePer(String perId) {
this.perId = perId;
}
// setter and getter
...................
}
2.2 TgPersonneMoralePer.java
import org.hibernate.search.annotations.Field;
public class TgPersonneMoralePer implements java.io.Serializable {
private String perId;
private TgPersonnePer tgPersonnePer;
@Field
private String perDenoSociale;
@Field
private String perSigle;
public TgPersonneMoralePer() {
}
public TgPersonneMoralePer(TgPersonnePer tgPersonnePer) {
this.tgPersonnePer = tgPersonnePer;
}
// Setter and getter
.................
}
3.我的休眠配置文件:hibernate.cfg.xml中
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.bytecode.use_reflection_optimizer">false</property>
<property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:XE</property>
<property name="hibernate.connection.username">exam</property>
<property name="hibernate.connection.password">azerty</property>
<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
<property name="hibernate.search.autoregister_listeners">true</property>
<property name="hibernate.validator.apply_to_ddl">false</property>
<!-- Echo all executed SQL to stdout -->
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.show_sql">true</property>
<!-- Hibernate research configuration-->
<property name="hibernate.search.default.directory_provider">filesystem</property>
<property name="hibernate.search.default.indexBase">D:\Lucene\indexes</property>
<property name="hibernate.ejb.event.post-insert">org.hibernate.search.event.FullTextIndexEventListener</property>
<property name="hibernate.ejb.event.post-update">org.hibernate.search.event.FullTextIndexEventListener</property>
<property name="hibernate.ejb.event.post-delete">org.hibernate.search.event.FullTextIndexEventListener</property>
<mapping resource="org/module/entities/TgPersonneMoralePer.hbm.xml" />
<mapping resource="org/module/entities/TgPersonnePer.hbm.xml" />
</session-factory>
</hibernate-configuration>
4.我的JBoss部署结构:JBoss的部署,structure.xml
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
<dependencies>
<module name="org.hibernate" slot="main"/>
<module name="org.jboss.logging" slot="main"/>
<module name="javax.transaction.api" slot="main"/>
<module name="org.javassist"/>
<!-- Module de hibernate Search -->
<module name="org.hibernate.search.orm" slot="main"/>
<module name="org.hibernate.search.engine" slot="main"/>
<module name="org.apache.lucene" slot="main"/>
<module name="org.apache.lucene.internal" slot="main"/>
</dependencies>
<exclusions>
<module name="org.javassist" slot="main"/>
</exclusions>
</deployment>
</jboss-deployment-structure>
答
您需要从Hibernate Search的ORM模块暴露服务。
因此,像以下将依次是:
<module name="org.hibernate.search.orm" services="export" slot="main"/>
加入这个模块也足以让Hibernate Search的运行,你不应该需要添加其他模块(发动机和Lucene)。
非常感谢你匹配#Guillaume,它的工作原理。 –
或者,如果您使用最新的WilFly 10.1,则不需要任何'jboss-deployment-structure.xml':将自动设置正确的依赖关系。如果您想使用与WildFly中包含的不同版本的任何Hibernate库,则只需重写该版本。 – Sanne