Compass学习文档(3) (转)

本文介绍如何将Compass与Hibernate及Spring框架集成,实现全文检索功能。通过配置Spring管理的Hibernate和Compass,自动同步数据库更改到索引,无需额外编写Compass代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 下面讲一下高级部分Compass与Hibernate,Spring的集成。Compass内部有对Hibernate,Spring的支持,如果配置好了,可以在建立和更新索引的时候不用Compass写一句代码。爽吧!~不过集成它们比较麻烦那就看我一步一步的来吧:
1.首先把Hibernate和Spring集成:

      来个例子吧,先看数据库脚本(MySql):

Sql代码 复制代码
  1. CREATE TABLE `article` (   
  2.   
  3.  `Id` int(11) NOT NULL auto_increment,   
  4.   
  5.  `title` varchar(40) NOT NULL default '',   
  6.   
  7.  `author` int(11) default '0',   
  8.   
  9.  `publish_date` date NOT NULL default '0000-00-00',   
  10.   
  11.  PRIMARY KEY (`Id`)   
  12.   
  13. ) TYPE=MyISAM;   
  14.   
  15.     
  16.   
  17. CREATE TABLE `author` (   
  18.   
  19.  `Id` int(11) NOT NULL auto_increment,   
  20.   
  21.  `username` varchar(20) NOT NULL default '',   
  22.   
  23.  `passwordvarchar(20) NOT NULL default '',   
  24.   
  25.  `age` smallint(6) default '0',   
  26.   
  27.  PRIMARY KEY (`Id`)   
  28.   
  29. ) TYPE=MyISAM;  
CREATE TABLE `article` (

 `Id` int(11) NOT NULL auto_increment,

 `title` varchar(40) NOT NULL default '',

 `author` int(11) default '0',

 `publish_date` date NOT NULL default '0000-00-00',

 PRIMARY KEY (`Id`)

) TYPE=MyISAM;

 

CREATE TABLE `author` (

 `Id` int(11) NOT NULL auto_increment,

 `username` varchar(20) NOT NULL default '',

 `password` varchar(20) NOT NULL default '',

 `age` smallint(6) default '0',

 PRIMARY KEY (`Id`)

) TYPE=MyISAM;

 

      建立一个工程叫CompassHibernateSpring

      说明一下开发环境:eclipse3.2+myeclipse5.0+springtide+middlegen(注意要在工程上加入MyEcilpse的Hibernate和Spring能力。

      然后用Hibernate进行装配,Hibernate有三个配置文件:hibernate.cfg.xml, Article.hbm.xml,Author.hbm.xml

      具体的结构请看Hibernate.cfg.xml:

Xml代码 复制代码
  1. <?xml version='1.0' encoding='utf-8'?>  
  2.   
  3. <!DOCTYPE hibernate-configuration PUBLIC    
  4.   
  5.     "-//Hibernate/Hibernate Configuration DTD//EN"   
  6.   
  7.     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
  8.   
  9. <hibernate-configuration>  
  10.   
  11.     <session-factory>  
  12.   
  13.         <property name="dialect">org.hibernate.dialect.MySQLDialect</property>  
  14.   
  15.         <property name="connection.driver_class">com.mysql.jdbc.Driver</property>  
  16.   
  17.         <property name="connection.username">root</property>  
  18.   
  19.         <property name="connection.password">java</property>  
  20.   
  21.         <property name="connection.url">jdbc:mysql://localhost:3306/test</property>  
  22.   
  23.         <property name="show_sql">true</property>  
  24.   
  25.         <mapping resource="org/li/compass/shibernate/Article.hbm.xml" />  
  26.   
  27.         <mapping resource="org/li/compass/shibernate/Author.hbm.xml" />  
  28.   
  29.     </session-factory>  
  30.   
  31. </hibernate-configuration>  
  32.   
  33. Article.hbm.xml:   
  34.   
  35. <?xml version="1.0"?>  
  36.   
  37. <!DOCTYPE hibernate-mapping PUBLIC   
  38.   
  39.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"   
  40.   
  41.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >  
  42.   
  43. <hibernate-mapping>  
  44.   
  45. <!--    
  46.   
  47.     Created by the Middlegen Hibernate plugin 2.2   
  48.   
  49.     http://boss.bekk.no/boss/middlegen/   
  50.   
  51.     http://www.hibernate.org/   
  52.   
  53. -->  
  54.   
  55. <class    
  56.   
  57.     name="org.li.compass.shibernate.Article"    
  58.   
  59.     table="article"  
  60.   
  61.     lazy="false"  
  62.   
  63. >    
  64.   
  65.     <id  
  66.   
  67.         name="id"  
  68.   
  69.         type="java.lang.Integer"  
  70.   
  71.         column="Id"  
  72.   
  73.     >  
  74.   
  75.             <meta attribute="field-description" inherit="false">  
  76.   
  77.                auto_increment   
  78.   
  79.             </meta>  
  80.   
  81.         <generator class="increment" />  
  82.   
  83.     </id>  
  84.   
  85.     <property  
  86.   
  87.         name="title"  
  88.   
  89.         type="java.lang.String"  
  90.   
  91.         column="title"  
  92.   
  93.         not-null="true"  
  94.   
  95.         length="40"  
  96.   
  97.     />  
  98.   
  99.     <property  
  100.   
  101.         name="author"  
  102.   
  103.         type="java.lang.String"  
  104.   
  105.         column="author"  
  106.   
  107.         length="11"  
  108.   
  109.     />  
  110.   
  111.     <property  
  112.   
  113.         name="publishDate"  
  114.   
  115.         type="java.util.Date"  
  116.   
  117.         column="publish_date"  
  118.   
  119.         not-null="true"  
  120.   
  121.         length="10"  
  122.   
  123.     />  
  124.   
  125.     <!-- Associations -->  
  126.   
  127.     
  128.   
  129. </class>  
  130.   
  131. </hibernate-mapping>  
  132.   
  133. Author.hbm.xml:   
  134.   
  135. <?xml version="1.0"?>  
  136.   
  137. <!DOCTYPE hibernate-mapping PUBLIC   
  138.   
  139.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"   
  140.   
  141.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >  
  142.   
  143. <hibernate-mapping>  
  144.   
  145. <!--    
  146.   
  147.     Created by the Middlegen Hibernate plugin 2.2   
  148.   
  149.     http://boss.bekk.no/boss/middlegen/   
  150.   
  151.     http://www.hibernate.org/   
  152.   
  153. -->  
  154.   
  155. <class    
  156.   
  157.     name="org.li.compass.shibernate.Author"    
  158.   
  159.     table="author"  
  160.   
  161.     lazy="false"  
  162.   
  163. >    
  164.   
  165.     <id  
  166.   
  167.         name="id"  
  168.   
  169.         type="java.lang.Integer"  
  170.   
  171.         column="Id"  
  172.   
  173.     >  
  174.   
  175.             <meta attribute="field-description" inherit="false">  
  176.   
  177.                auto_increment   
  178.   
  179.             </meta>  
  180.   
  181.        
  182.   
  183.         <generator class="increment" />  
  184.   
  185.     </id>  
  186.   
  187.     <property  
  188.   
  189.         name="username"  
  190.   
  191.         type="java.lang.String"  
  192.   
  193.         column="username"  
  194.   
  195.         not-null="true"  
  196.   
  197.         length="20"  
  198.   
  199.     />  
  200.   
  201.     <property  
  202.   
  203.         name="password"  
  204.   
  205.         type="java.lang.String"  
  206.   
  207.         column="password"  
  208.   
  209.         not-null="true"  
  210.   
  211.         length="20"  
  212.   
  213.     />  
  214.   
  215.     <property  
  216.   
  217.         name="age"  
  218.   
  219.         type="java.lang.Short"  
  220.   
  221.         column="age"  
  222.   
  223.         length="6"  
  224.   
  225.     />  
  226.   
  227.     <!-- Associations -->  
  228.   
  229.   
  230. </class>  
  231.   
  232. </hibernate-mapping>  

      具本的POJO类看源代码吧:

      由于这里是讲Compass的,有关Hibernate和Spring的内容网上很多中文资料的这里就不介绍了。

      下面讲的是跟着我一步一步用Spring把Hibernate和Compass集成起来。

      在applicationContext.xml中:

Xml代码 复制代码
  1. <bean id="sessionFactory"  
  2.   
  3.         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  4.   
  5.         <property name="dataSource">  
  6.   
  7.             <ref local="dataSource" />  
  8.   
  9.         </property>  
  10.   
  11.         <property name="hibernateProperties">  
  12.   
  13.             <props>  
  14.   
  15.                 <prop key="dialect">  
  16.   
  17.                     org.hibernate.dialect.MySQLDialect   
  18.   
  19.                 </prop>  
  20.   
  21.                 <prop key="show_sql">true</prop>  
  22.   
  23.             </props>  
  24.   
  25.         </property>  
  26.   
  27.         <property name="mappingDirectoryLocations">  
  28.   
  29.             <list>  
  30.   
  31.                 <value>org/li/compass/shibernate</value>  
  32.   
  33.             </list>  
  34.   
  35.         </property>  
  36.   
  37.     </bean>  
  38.   
  39. <bean id="dataSource"  
  40.   
  41.         class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
  42.   
  43.         <property name="driverClassName">  
  44.   
  45.             <value>com.mysql.jdbc.Driver</value>  
  46.   
  47.         </property>  
  48.   
  49.         <property name="url">  
  50.   
  51.             <value>jdbc:mysql://localhost:3306/test</value>  
  52.   
  53.         </property>  
  54.   
  55.         <property name="username">  
  56.   
  57.             <value>root</value>  
  58.   
  59.         </property>  
  60.   
  61.         <property name="password">  
  62.   
  63.             <value>java</value>  
  64.   
  65.         </property>  
  66.   
  67.     </bean>  
  68.   
  69.     <bean id="hibernateTemplate"  
  70.   
  71.         class="org.springframework.orm.hibernate3.HibernateTemplate">  
  72.   
  73.         <property name="sessionFactory">  
  74.   
  75.             <ref local="sessionFactory" />  
  76.   
  77.         </property>  
  78.   
  79.     </bean>  
  80.   
  81. <bean id="articleDAO" class="org.li.compass.shibernate.dao.ArticleDAO">  
  82.   
  83.         <property name="hibernateTemplate">  
  84.   
  85.             <ref local="hibernateTemplate"/>  
  86.   
  87.         </property>  
  88.   
  89.     </bean>  
  90.   
  91.     <bean id="authorDAO" class="org.li.compass.shibernate.dao.AuthorDAO">  
  92.   
  93.         <property name="hibernateTemplate">  
  94.   
  95.             <ref local="hibernateTemplate"/>  
  96.   
  97.         </property>  
  98.   
  99.     </bean>  
  100.   
  101. <bean id="transactionManager"  
  102.   
  103.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  104.   
  105.         <property name="sessionFactory">  
  106.   
  107.             <ref local="sessionFactory" />  
  108.   
  109.         </property>  
  110.   
  111.     </bean>  

      以上的配置是将Spring和Hibernate集成起来。

      下面我们将加入Compass的配置:

      由于我们只对文章进行搜索所以只对文章建立索引

      Article.cpm.xml:

Xml代码 复制代码
  1. <!DOCTYPE compass-core-mapping PUBLIC    
  2.   
  3.     "-//Compass/Compass Core Mapping DTD 1.0//EN"   
  4.   
  5.     "http://www.opensymphony.com/compass/dtd/compass-core-mapping.dtd">  
  6.   
  7. <compass-core-mapping package="org.li.compass.shibernate">  
  8.   
  9.     <class name="Article" alias="article">  
  10.   
  11.         <!-- 这是必须有的 -->  
  12.   
  13.         <id name="id"/>  
  14.   
  15.         <!-- 你可以通过这个配置来在底层给这个对象加一个Field("type","java") -->  
  16.   
  17.         <constant>  
  18.   
  19.             <meta-data>type</meta-data>  
  20.   
  21.             <meta-data-value>java</meta-data-value>  
  22.   
  23.         </constant>  
  24.   
  25.         <!-- 配置一下属性 -->  
  26.   
  27.         <property name="title">  
  28.   
  29.             <meta-data>titleIndex</meta-data>  
  30.   
  31.         </property>  
  32.   
  33.         <property name="publishDate">  
  34.   
  35.             <meta-data>publishDateIndex</meta-data>  
  36.   
  37.         </property>  
  38.   
  39.         <property name="author">  
  40.   
  41.             <meta-data>author</meta-data>  
  42.   
  43.         </property>  
  44.   
  45.     </class>  
  46.   
  47. </compass-core-mapping>  

      然后回到applicationContext.xml里:

      看看怎么集成的,在Compass中有个org.compass.gps.impl.SingleCompassGps是对Compass进行实时更新的,而org.compass.spring.device.hibernate.SpringHibernate3GpsDevice

      它是和Hibernate集成并且对Hibernate的insert,delete,update进行自动的更新,所以说这样就不

      我们为Compass写一句代码了。不过这两个类对Compass和Hibernate的实时功能也可以用Spring的AOP来实现(这里也不讨论了)。剩下的就是用Spring的IoC来支Compass的初始化功能进行注入,第一个是:

Xml代码 复制代码
  1. <bean id="compassConfiguration"  
  2.   
  3.         class="org.compass.core.config.CompassConfiguration" />  

 第二个是:

Xml代码 复制代码
  1. <bean id="compass" class="org.compass.spring.LocalCompassBean">  
  2.   
  3.         <!-- 这里配置只用作建立索引的类 -->  
  4.   
  5.         <property name="classMappings">  
  6.   
  7.             <list>  
  8.   
  9.                 <value>org.li.compass.shibernate.Article</value>  
  10.   
  11.             </list>  
  12.   
  13.         </property>  
  14.   
  15.   
  16.         <property name="resourceDirectoryLocations">  
  17.   
  18.             <list>  
  19.   
  20.                 <value>org/li/compass/shibernate</value>  
  21.   
  22.             </list>  
  23.   
  24.         </property>  
  25.   
  26.         <property name="compassConfiguration"  
  27.   
  28.             ref="compassConfiguration" />  
  29.   
  30.         <property name="compassSettings">  
  31.   
  32.             <props>  
  33.   
  34.                 <prop key="compass.engine.connection">target/test</prop>  
  35.   
  36.                 <prop key="compass.transaction.factory">  
  37.   
  38.                     org.compass.spring.transaction.SpringSyncTransactionFactory   
  39.   
  40.                 </prop>  
  41.   
  42.             </props>  
  43.   
  44.         </property>  
  45.   
  46.         <property name="transactionManager" ref="transactionManager" />  
  47.   
  48.     </bean>  

      在上面配置只用作建立索引的类就可以

      还有与Hibernate和Spring集成差不多。有个CompassTemplate的DAO模板也要注入

Xml代码 复制代码
  1. <bean id="compassTemplate" class="org.compass.core.CompassTemplate">  
  2.   
  3.         <property name="compass">  
  4.   
  5.             <ref local="compass"/>  
  6.   
  7.         </property>  
  8.   
  9.     </bean>  

      还有关键的两个类的注入:

Xml代码 复制代码
  1. <bean id="hibernateGpsDevice"  
  2.   
  3.         class="org.compass.spring.device.hibernate.SpringHibernate3GpsDevice">  
  4.   
  5.         <property name="name">  
  6.   
  7.             <value>hibernateDevice</value>  
  8.   
  9.         </property>  
  10.   
  11.         <property name="sessionFactory" ref="sessionFactory" />  
  12.   
  13.     </bean>  
  14.   
  15. <bean id="compassGps" class="org.compass.gps.impl.SingleCompassGps"  
  16.   
  17.         init-method="start" destroy-method="stop">  
  18.   
  19.         <property name="compass" ref="compass" />  
  20.   
  21.         <property name="gpsDevices">  
  22.   
  23.             <list>  
  24.   
  25.                 <ref local="hibernateGpsDevice" />  
  26.   
  27.             </list>  
  28.   
  29.         </property>  
  30.   
  31.     </bean>  

      最后呢就是要在articleDAO上注入CompassTemplate因为我们要搜索的时候用到CompassTemplate了(CompassTemplate是支持事务的)

Xml代码 复制代码
  1. <property name="compassImplements">  
  2.   
  3.             <ref local="compassImplements"/>  
  4.   
  5.         </property>  

      这样配置就ok了

      下面测试一下吧:

      新建JUnit测试用例:

Java代码 复制代码
  1. public class TestCompass extends TestCase   
  2.   
  3. {   
  4.   
  5.     private ClassPathXmlApplicationContext context = null;   
  6.   
  7.     protectedvoid setUp() throws Exception   
  8.   
  9.     {   
  10.   
  11.         context = new ClassPathXmlApplicationContext("applicationContext.xml");   
  12.   
  13.     }   
  14.   
  15.     protected void tearDown() throws Exception   
  16.   
  17.     {   
  18.   
  19.     }   
  20.   
  21.     public void insertTest()   
  22.   
  23.     {   
  24.   
  25.         ArticleDAO articleDao = (ArticleDAO) context.getBean("articleDAO");   
  26.   
  27.         AuthorDAO authorDao = (AuthorDAO) context.getBean("authorDAO");   
  28.   
  29.         Article article = new Article();   
  30.   
  31.         Author author = new Author();   
  32.   
  33.         author.setAge((short)21);   
  34.   
  35.         author.setUsername("javafish");   
  36.   
  37.         author.setPassword("java");   
  38.   
  39.         article.setTitle("Compass学习文档");   
  40.   
  41.         article.setPublishDate(new Date());   
  42.   
  43.         article.setAuthor("javafish");   
  44.   
  45.         authorDao.save(author);   
  46.   
  47.         articleDao.save(article);   
  48.   
  49.            
  50.   
  51.     }   
  52.   
  53.     public void find()   
  54.   
  55.     {   
  56.   
  57.         ArticleDAO articleDao = (ArticleDAO) context.getBean("articleDAO");   
  58.   
  59.         Article article = articleDao.find("文档");   
  60.   
  61.         System.out.println(article.getPublishDate());   
  62.   
  63.     }   
  64.   
  65. }  
public class TestCompass extends TestCase

{

    private ClassPathXmlApplicationContext context = null;

    protectedvoid setUp() throws Exception

    {

        context = new ClassPathXmlApplicationContext("applicationContext.xml");

    }

    protected void tearDown() throws Exception

    {

    }

    public void insertTest()

    {

        ArticleDAO articleDao = (ArticleDAO) context.getBean("articleDAO");

        AuthorDAO authorDao = (AuthorDAO) context.getBean("authorDAO");

        Article article = new Article();

        Author author = new Author();

        author.setAge((short)21);

        author.setUsername("javafish");

        author.setPassword("java");

        article.setTitle("Compass学习文档");

        article.setPublishDate(new Date());

        article.setAuthor("javafish");

        authorDao.save(author);

        articleDao.save(article);

        

    }

    public void find()

    {

        ArticleDAO articleDao = (ArticleDAO) context.getBean("articleDAO");

        Article article = articleDao.find("文档");

        System.out.println(article.getPublishDate());

    }

}

      看到没有在insertTest()里根本看不出用Compass来全是Hibernate和Spring的代码。

      在对像article和author被写入数据库的同时,article也被写入索引了。

      看到了Compass与Hibernate,Spring集成的威力了吧。

      我们可以用Lucene测试一下。

Java代码 复制代码
  1. publicvoid lucene() throws IOException, ParseException   
  2.   
  3.     {   
  4.   
  5.         IndexSearcher indexSearcher = new IndexSearcher("D:""workspace""CompassSpringHibernate""target""test""index""article");   
  6.   
  7.         QueryParser queryParser = new QueryParser("titleIndex",new StandardAnalyzer());   
  8.   
  9.         Query query = queryParser.parse("学习");   
  10.   
  11.         Hits hits = indexSearcher.search(query);   
  12.   
  13.         Document doc = null;   
  14.   
  15.         for(int i=0;i<hits.length();i++)   
  16.   
  17.         {   
  18.   
  19.             doc=hits.doc(i);   
  20.   
  21.             System.out.println(doc.get("titleIndex"));   
  22.   
  23.             System.out.println(doc.get("publishDateIndex"));   
  24.   
  25.         }   
  26.   
  27.     }  
publicvoid lucene() throws IOException, ParseException

    {

        IndexSearcher indexSearcher = new IndexSearcher("D:""workspace""CompassSpringHibernate""target""test""index""article");

        QueryParser queryParser = new QueryParser("titleIndex",new StandardAnalyzer());

        Query query = queryParser.parse("学习");

        Hits hits = indexSearcher.search(query);

        Document doc = null;

        for(int i=0;i<hits.length();i++)

        {

            doc=hits.doc(i);

            System.out.println(doc.get("titleIndex"));

            System.out.println(doc.get("publishDateIndex"));

        }

    }

 
      会发现结果搜索成功了~~

      而我们查询的时候就可以在DAO类里封装CompassQuery的操作。

      其它具体还是看帮助文档吧。^_^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值