需要准备的包: hibernate3.2.0.jar hibernate-annotations.jar ejb3-persistence.jar lucene-core-2.0.0.jar spring1.2.6.jar 基本上值得注意的包就这些了,如果你有用ehcache做hibernate的cache,那么你需要 使用ehcache-1.2.1版本的jar包。 ejb3-persistence.jar包可以在hibernate-annotations的下载包中找到 关于hibernate的配置: <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" " http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd "> <hibernate-configuration> <session-factory name="sessionFactory"> <property name=" hibernate.lucene.index_dir ">/indexDir</property> <property name=" hibernate.lucene.analyzer ">org.apache.lucene.analysis.standard.StandardAnalyzer</property> <event type=" post-commit-update "> <listener class="org.hibernate.lucene.event.LuceneEventListener"/> </event> <event type=" post-commit-insert "> <listener class="org.hibernate.lucene.event.LuceneEventListener"/> </event> <event type=" post-commit-delete " > <listener class="org.hibernate.lucene.event.LuceneEventListener"/> </event> </session-factory> </hibernate-configuration> hibernate.lucene.analyzer 这是为lucene指定一个分词器 这两项不是必须配置的,但是配置了以后,省去许多麻烦 post-commit-update,post-commit-insert,post-commit-delete 为hibernate这3种状态指定监听器。hibernate正是透过这3个状态的监听,来更新lucene索引的 hibernate.lucene.index_dir: 这是为lucene指定一个index目录(可以给绝对路径,因为我是linux系统,所以没有盘符),当然仅对hibernate有效,如果你跳过hibernate直接操作 lucene,这个目录是没有用的 Spring下的配置: <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource"><ref local="dataSource"/></property> <property name="mappingResources"> <list> <value>FaqMessage.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop> <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop> <prop key="hibernate.connection.release_mode">on_close</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.connection.autocommit">false</prop> </props> </property> <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration"/> <property name="configLocation" value="classpath:hibernate.cfg.xml"/> </bean> 熟悉spring+hibernate的人应该都对这个配置不陌生,值得注意的是最后两项,一定要配。 定义hibernate实体 @Indexed(index="/FaqIndex") public class Faq extends BaseFaq { private static final long serialVersionUID = 1L; private int id; private String subject; private String messageContent; @Keyword(id=true) public int getId() { return this.id; } @Text(name="subject") public String getSubject() { return subject; } public void setSubject(String subject) { this.subject = subject; } @Unstored(name="message") public String getMessageContent() { return this.messageContent; } } 首先讲一下hibernate这四种annotation类型 @Indexed(index="//FaqIndex") 这个类型指定了你的实体在写入Lucene indexer的时的路径,如果你之前配置了hibernate.lucene.index_dir, 则相对路径是对hibernate.lucene.index_dir的相对路径,也就是说,"//FaqIndex"这个文件夹,是放在hibernate.lucene.index_dir下的子文件夹 并且,需要注意的是,如果你将index的路径指为"/",则他访问的是hibernate.lucene.index_dir这个文件夹, 如果你没有在hibernate.lucene.index_dir事先建立起任何索引,他是追加不进去的. @Keyword(id=true) 基本上,你需要将hibernate实体的Id 声明为lucene field的Keyword类型,并且将id=true,没有办法,hibernte永远是靠id来找实体的,现在跟lucene做配合,也是靠的id, field名称会是"Id". @Text(name="subject") public String getMessageSubject() { return super.getMessageSubject(); } 这段是将messageSubject属性声明成名字为"subject",类型为Text的field @Unstored(name="message") public String getMessageContent() { return this.messageContent; } } 这段是将messageContent属性声明成名字为"message",类型为Unstored的field ( 基本上到次,所有的配置就完成了. 每次做update,save,delete的时候,hibernate会自动更新lucence的索引, 而不用写hibernate拦截器那么痛苦了. 基本上hibernate的 annotations for lucene这一块就是为了解决lucene的索引更新问题了 上文参考了hibernate官方的配置方法,但是如果完全按照官方的配置方法,根本是配置不起来的, 所以写下此文,希望能给大家一点指引 此文仅仅介绍了配置,如果大家想了解lucene的实际用法,我过段时间,会举一个实例,来解释lucene2.0的 用法. 当然你可以去当当网( http://www.dangdang.com )定购<Ajax+lucene>这本书,只是里面介绍的是
Lucene+hibernate+spring配置心得
最新推荐文章于 2023-12-14 16:02:07 发布