`
alienj
  • 浏览: 78780 次
  • 性别: 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例子 。

分享到:
评论

相关推荐

    org.springframework.orm.hibernate3.LocalSessionFactoryBean

    ### 关于 "org.springframework.orm.hibernate3.LocalSessionFactoryBean" 未找到问题的知识点解析 #### 一、问题背景 在开发基于Spring与Hibernate整合的应用时,可能会遇到“`org.springframework.orm.hibernate...

    org.hibernate.ejb-library-3.4.0.GA-A

    标题 "org.hibernate.ejb-library-3.4.0.GA-A" 指示这是一个与Hibernate相关的库,特别针对EJB(Enterprise JavaBeans)版本3.4.0,并且是为OSGi环境优化的。描述中提到它适用于在Virgo Jetty服务器上进行Web开发,...

    org.hibernate.HibernateException: No Hibernate Session bound to thread

    Hibernate Session 绑定线程解决方案 在 Java web 开发中, Hibernate 是一个非常流行的 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到关系数据库中。然而,在使用 Hibernate 进行数据库操作时,...

    hibernate.5.1.0.jar全部

    包含hibernate所有所需jar包还有一些其他包日志包、jpa支持包等: 列如:hibernate-core-5.1.0.Final.jar hibernate-ehcache-5.1.0.Final.jar hibernate-entitymanager-5.1.0.Final.jar hibernate-envers-5.1.0....

    org.hibernate.jpa.QueryHints jar包

    org.hibernate.jpa.QueryHints jar hibernate-entitymanager-4.3.0.Final.jar

    HIbernate4.3.6整合c3p0所需jar

    org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.connections.spi.ConnectionProvider] at org.hibernate.service.internal....

    hibernate jar包:hibernate-commons-annotations-4.0.1.Final.jar等

    Hibernate.jar包,Hibernate可以应用在任何使用JDBC的场合,包含 hibernate-commons-annotations-4.0.1.Final.jar hibernate-core-4.1.12.Final.jar hibernate-ehcache-4.1.12.Final.jar hibernate-entitymanager-...

    org.hibernate.eclipse.feature_3.2.3.GA

    org.hibernate.eclipse.feature_3.2.3.GAorg.hibernate.eclipse.feature_3.2.3.GA

    hibernate4.0使用二级缓存jar包

    ehcache 二级缓存 配置使用的jar包 配置如下: &lt;!-- 启用二级缓存 --&gt; &lt;property name="hibernate.cache.use_second_level_cache"&gt;true &lt;!-- 查询的二级缓存配置 --&gt; &lt;property name="hibernate....

    韩顺平.2011版.hibernate笔记.zip

    《韩顺平.2011版.hibernate笔记》是一份针对Hibernate框架的详细学习资料,由知名IT讲师韩顺平在2011年编撰而成。Hibernate是Java开发领域中广泛使用的对象关系映射(ORM)框架,它极大地简化了数据库操作,使开发者...

    解决SpringDataJPA报错:org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null w

    问题描述 用SpringBoot + Spring Data JPA操作数据库 项目启动的时候 报了一个错 SpringBoot的版本是2.2.6.RELEASE org.springframework.beans.factory.BeanCreationException: Error creating bean with name '...

    HIbernate4.3.6-c3p0所需jar.rar

    Caused by: org.hibernate.boot.registry.selector.spi.StrategySelectionException: Unable to resolve name [org.hibernate.connection.C3P0ConnectionProvider] as strategy [org.hibernate.engine.jdbc.... ...

    com.springsource.org.hibernate.cache-3.3.2.GA.jar

    jar包,官方版本,自测可用

    hibernate--5.Hibernate配置文件详解-2

    Hibernate提供了第一级缓存(Session缓存)和第二级缓存。第二级缓存可以使用第三方插件如Ehcache或Infinispan: ```xml &lt;property name="hibernate.cache.use_second_level_cache"&gt;true &lt;property name="hibernate....

    hibernate-tools(包含版本3、版本5)解决hbm.xml中文注释乱码和生成实体类注释

    在eclipse上通过hibernate工具,将数据库表生成Java类和xml配置文件 总共有2个版本,根据自己的需求使用版本3或者5: 1. hibernate-tools-3.4.0.CR2.jar是修改完成的jar包,直接替换原来的jar包, 重启eclipse即可...

    Manning.Java.Persistence.with.Hibernate

    《Manning.Java.Persistence.with.Hibernate》一书是Hibernate领域的权威指南,由Hibernate项目的主导开发者撰写,深入浅出地讲解了Hibernate框架的核心概念、架构设计、配置方法以及在实际开发中的应用技巧。...

    最新二级缓存memcached,支持hibernate4

    解决目前memcached不支持hibernate4的缺陷,hibernate配置&lt;property name="hibernate.cache.region.factory_class"&gt;com.googlecode.hibernate.memcached.MemcachedRegionFactory&lt;/property&gt;

    maven+hibernate

    标题 "maven+hibernate" 暗示我们讨论的是使用 Maven 作为构建工具,与 Hibernate 这一流行的对象关系映射(ORM)框架整合的项目。在Java开发中,Maven 和 Hibernate 是两个非常重要的组件。Maven 用于自动化项目的...

    hibernate--5.Hibernate配置文件详解

    Hibernate支持第二级缓存,可以提高性能。`&lt;cache&gt;`元素用于配置缓存提供者和实体类的缓存策略。 **5. Transaction Configuration** `&lt;transaction&gt;`元素用来配置事务管理器,例如JTA或Hibernate自身的Transaction...

Global site tag (gtag.js) - Google Analytics