`
alienj
  • 浏览: 81716 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

第28章. Hibernate搜索

阅读更多


 

28.1. 介绍

 

Apache Lucene? 之类的全文本搜索引擎是一种非常强大的技术,给应用程序带来了全文本和有效的查询。 Hibernate搜索,其使用了受保护的Apache Lucene, 用附加的几个注释索引你的域模型,关注数据库/索引同步,并且返回与全文本查询相匹配的标准的托管对象。请记住,思考,存在的不匹配,当在一个文本查询之上处理一个对象的域模型时引发的不匹配(保持数据的最新索引,索引结构与域模型的不匹配,查询不匹配)。但是,快速有效的好处远远地超过了这些局限性。

 

Hibernate搜索旨在很好地整合,并尽可能自然地使用JPA和Hibernate。作为一个自然延伸,JBoss Seam提供了一个Hibernate搜索集成。

 

Hibernate搜索对象的详细信息,请参考Hibernate搜索文档

 

28.2. 配置

 

Hibernate搜索使用META-INF/persistence.xml或hibernate.cfg.xml 文件进行配置

 

Hibernate搜索配置对大多数配置参数存在智能默认 。这里是一个入门的最小的持久化单元配置。

 

<persistence-unit name="sample">

 

   <jta-data-source>java:/DefaultDS</jta-data-source>

 

   <properties>

 

      [...]

 

      <!—使用一个基于索引的文件系统 -->

 

      <property name="hibernate.search.default.directory_provider" 

 

         value="org.hibernate.search.store.FSDirectoryProvider"/>

 

      <!—索引将被存储的目录 -->

 

      <property name="hibernate.search.default.indexBase" 

 

         value="/Users/prod/apps/dvdstore/dvdindexes"/>

 

   </properties>

 

</persistence-unit>

 

如果你打算瞄准Hibernate注释或EntityManager 3.2.x (嵌于JBoss AS 4.2.GA内部的), 你也需要配置适当的事件侦听器。

 

<persistence-unit name="sample">

 

   <jta-data-source>java:/DefaultDS</jta-data-source>

 

   <properties>

 

      [...]

 

      <!-- 使用一个基于索引的文件系统 -->

 

      <property name="hibernate.search.default.directory_provider" 

 

                value="org.hibernate.search.store.FSDirectoryProvider"/>

 

      <!-- 索引将被存储的目录 -->

 

      <property name="hibernate.search.default.indexBase" 

 

                value="/Users/prod/apps/dvdstore/dvdindexes"/>

 

 

 

      <property name="hibernate.ejb.event.post-insert" 

 

                value="org.hibernate.search.event.FullTextIndexEventListener"/>

 

      <property name="hibernate.ejb.event.post-update" 

 

                value="org.hibernate.search.event.FullTextIndexEventListener"/>

 

      <property name="hibernate.ejb.event.post-delete" 

 

                value="org.hibernate.search.event.FullTextIndexEventListener"/>

 

 

 

   </properties>

 

</persistence-unit>

 

注意

 

如果使用的是Hibernate注释或EntityManager 3.3.x,这步就不再需要了。

 

除了配置文件之外,下面的jar包必须被部署:

 

  • hibernate-search.jar
  • hibernate-commons-annotations.jar
  • lucene-core.jar
  •  

 

注意

 

如果你在一个EAR中部署了它们,不要忘了更新application.xml。

 

28.3. 用法

Hibernate搜索使用注释映射实体到一个Lucene索引,详情请查参考文档  

 

Hibernate搜索完全整合了API和JPA/Hibernate语义。 仅几行代码,就可以从一个HQL或基于查询请求的条件(Criteria)进行转换。与应用程序交互的主要API是FullTextSession API(Hibernate会话的子类 Session)。

 

Hibernate搜索被引入, JBoss Seam就可注入一个FullTextSession。

 

@Stateful

 

@Name("search")

 

public class FullTextSearchAction implements FullTextSearch, Serializable {

 

 

   @In FullTextSession session;

 

 

   public void search(String searchString) {

 

      org.apache.lucene.search.Query luceneQuery = getLuceneQuery();

 

      org.hibernate.Query query session.createFullTextQuery(luceneQuery, Product.class);

 

      searchResults = query

 

            .setMaxResults(pageSize + 1)

 

            .setFirstResult(pageSize * currentPage)

 

            .list();

 

   }

 

   [...]

 

}

 

注意

 

FullTextSession继承了org.hibernate.Session,所以,它可以被用来作为一个标准的Hibernate会话。

 

如果使用Java持久化API, 一个更流畅的集成被提议。

 

@Stateful

 

@Name("search")

 

public class FullTextSearchAction implements FullTextSearch, Serializable {

 

   

 

   @In FullTextEntityManager em;

 

 

   public void search(String searchString) {

 

      org.apache.lucene.search.Query luceneQuery = getLuceneQuery();

 

      javax.persistence.Query query = em.createFullTextQuery(luceneQuery, Product.class);

 

      searchResults = query

 

            .setMaxResults(pageSize + 1)

 

            .setFirstResult(pageSize * currentPage)

 

            .getResultList();

 

   }

 

   [...]

 

}

 

Hibernate搜索被引入,就可注入一个FulltextEntityManager。FullTextEntityManager 继承了EntityManager的搜索特殊方法, 以同样的方式FullTextSession继承了会话 。

 

当使用EJB 3.0 会话或消息驱动Bean注入 (如,通过@PersistenceContext 注释), 在声明语句中用FullTextEntityManager接口替换EntityManager接口是不可能的。然而,注入实现可以是FullTextEntityManager实现:向下转型就可以了。

 

@Stateful

 

@Name("search")

 

public class FullTextSearchAction implements FullTextSearch, Serializable {

 

  

 

   @PersistenceContext EntityManager em;

 

 

   public void search(String searchString) {

 

      org.apache.lucene.search.Query luceneQuery = getLuceneQuery();

 

      FullTextEntityManager ftEm = (FullTextEntityManager) em;

 

      javax.persistence.Query query = ftEm.createFullTextQuery(luceneQuery, Product.class);

 

      searchResults = query

 

            .setMaxResults(pageSize + 1)

 

            .setFirstResult(pageSize * currentPage)

 

            .getResultList();

 

   }

 

   [...]

 

}

 

警告

 

对于习惯在Seam之外使用Hibernate搜索的人,注意, 使用Search.createFullTextSession 是没有必要的。

 

Hibernate搜索的具体应用请查看JBoss Seam 发布的DVDStore 或者blog例子 。

分享到:
评论

相关推荐

    Grails 技术精解与Web开发实践【源码+样章】----下载不扣分,回帖加1分,欢迎下载,童叟无欺

    第二篇 实际应用 第4章 商品维护 36 4.1 准备工作 36 4.2 查看商品列表 40 4.3 创建和编辑商品 44 4.4 本章小结 48 第5章 商品搜索 49 5.1 构造查询表单 49 5.2 复杂的数据库查询 50 5.2.1 ...

    网上书店实例

    在文件名称列表中,"ch28-bookstore"可能表示该实例来源于某个教程或章节的第28章,专门讲解网上书店的实现。这可能包括多个子文件夹或文件,比如模型类(.java)、配置文件(.xml)、JSP视图页面(.jsp)、以及可能...

    netbeans guide

    - **第28章:Java Persistence API (JPA)** - 介绍Java Persistence API的基本概念。 - 分析如何在NetBeans平台中使用JPA。 - 讨论JPA在Java应用开发中的应用场景。 - **第29章:MySQL与EclipseLink** - 介绍...

    J2EE学习笔记

    #### 第八章至第十章:特定领域的应用 这部分内容涵盖了搜索引擎、内容管理系统(CMS)、办公自动化(OA)系统、Ajax 技术等多个方面,旨在提供更广泛的行业视角和技术实践经验。 #### 第十一章:Hibernate、...

Global site tag (gtag.js) - Google Analytics