下面讲一下高级部分Compass与Hibernate,Spring的集成。Compass内部有对Hibernate,Spring的支持,如果配置好了,可以在建立和更新索引的时候不用Compass写一句代码。爽吧!~不过集成它们比较麻烦那就看我一步一步的来吧:
1.首先把Hibernate和Spring集成:
来个例子吧,先看数据库脚本(MySql):
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 version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.username">root</property>
<property name="connection.password">java</property>
<property name="connection.url">jdbc:mysql://localhost:3306/test</property>
<property name="show_sql">true</property>
<mapping resource="org/li/compass/shibernate/Article.hbm.xml" />
<mapping resource="org/li/compass/shibernate/Author.hbm.xml" />
</session-factory>
</hibernate-configuration>
Article.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<!--
Created by the Middlegen Hibernate plugin 2.2
http://boss.bekk.no/boss/middlegen/
http://www.hibernate.org/
-->
<class
name="org.li.compass.shibernate.Article"
table="article"
lazy="false"
>
<id
name="id"
type="java.lang.Integer"
column="Id"
>
<meta attribute="field-description" inherit="false">
auto_increment
</meta>
<generator class="increment" />
</id>
<property
name="title"
type="java.lang.String"
column="title"
not-null="true"
length="40"
/>
<property
name="author"
type="java.lang.String"
column="author"
length="11"
/>
<property
name="publishDate"
type="java.util.Date"
column="publish_date"
not-null="true"
length="10"
/>
<!-- Associations -->
</class>
</hibernate-mapping>
Author.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<!--
Created by the Middlegen Hibernate plugin 2.2
http://boss.bekk.no/boss/middlegen/
http://www.hibernate.org/
-->
<class
name="org.li.compass.shibernate.Author"
table="author"
lazy="false"
>
<id
name="id"
type="java.lang.Integer"
column="Id"
>
<meta attribute="field-description" inherit="false">
auto_increment
</meta>
<generator class="increment" />
</id>
<property
name="username"
type="java.lang.String"
column="username"
not-null="true"
length="20"
/>
<property
name="password"
type="java.lang.String"
column="password"
not-null="true"
length="20"
/>
<property
name="age"
type="java.lang.Short"
column="age"
length="6"
/>
<!-- Associations -->
</class>
</hibernate-mapping>
具本的POJO类看源代码吧:
由于这里是讲Compass的,有关Hibernate和Spring的内容网上很多中文资料的这里就不介绍了。
下面讲的是跟着我一步一步用Spring把Hibernate和Compass集成起来。
在applicationContext.xml中:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="dialect">
org.hibernate.dialect.MySQLDialect
</prop>
<prop key="show_sql">true</prop>
</props>
</property>
<property name="mappingDirectoryLocations">
<list>
<value>org/li/compass/shibernate</value>
</list>
</property>
</bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/test</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>java</value>
</property>
</bean>
<bean id="hibernateTemplate"
class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<bean id="articleDAO" class="org.li.compass.shibernate.dao.ArticleDAO">
<property name="hibernateTemplate">
<ref local="hibernateTemplate"/>
</property>
</bean>
<bean id="authorDAO" class="org.li.compass.shibernate.dao.AuthorDAO">
<property name="hibernateTemplate">
<ref local="hibernateTemplate"/>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
以上的配置是将Spring和Hibernate集成起来。
下面我们将加入Compass的配置:
由于我们只对文章进行搜索所以只对文章建立索引
Article.cpm.xml:
<!DOCTYPE compass-core-mapping PUBLIC
"-//Compass/Compass Core Mapping DTD 1.0//EN"
"http://www.opensymphony.com/compass/dtd/compass-core-mapping.dtd">
<compass-core-mapping package="org.li.compass.shibernate">
<class name="Article" alias="article">
<!-- 这是必须有的 -->
<id name="id"/>
<!-- 你可以通过这个配置来在底层给这个对象加一个Field("type","java") -->
<constant>
<meta-data>type</meta-data>
<meta-data-value>java</meta-data-value>
</constant>
<!-- 配置一下属性 -->
<property name="title">
<meta-data>titleIndex</meta-data>
</property>
<property name="publishDate">
<meta-data>publishDateIndex</meta-data>
</property>
<property name="author">
<meta-data>author</meta-data>
</property>
</class>
</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的初始化功能进行注入,第一个是:
<bean id="compassConfiguration"
class="org.compass.core.config.CompassConfiguration" />
第二个是:
<bean id="compass" class="org.compass.spring.LocalCompassBean">
<!-- 这里配置只用作建立索引的类 -->
<property name="classMappings">
<list>
<value>org.li.compass.shibernate.Article</value>
</list>
</property>
<property name="resourceDirectoryLocations">
<list>
<value>org/li/compass/shibernate</value>
</list>
</property>
<property name="compassConfiguration"
ref="compassConfiguration" />
<property name="compassSettings">
<props>
<prop key="compass.engine.connection">target/test</prop>
<prop key="compass.transaction.factory">
org.compass.spring.transaction.SpringSyncTransactionFactory
</prop>
</props>
</property>
<property name="transactionManager" ref="transactionManager" />
</bean>
在上面配置只用作建立索引的类就可以
还有与Hibernate和Spring集成差不多。有个CompassTemplate的DAO模板也要注入
<bean id="compassTemplate" class="org.compass.core.CompassTemplate">
<property name="compass">
<ref local="compass"/>
</property>
</bean>
还有关键的两个类的注入:
<bean id="hibernateGpsDevice"
class="org.compass.spring.device.hibernate.SpringHibernate3GpsDevice">
<property name="name">
<value>hibernateDevice</value>
</property>
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="compassGps" class="org.compass.gps.impl.SingleCompassGps"
init-method="start" destroy-method="stop">
<property name="compass" ref="compass" />
<property name="gpsDevices">
<list>
<ref local="hibernateGpsDevice" />
</list>
</property>
</bean>
最后呢就是要在articleDAO上注入CompassTemplate因为我们要搜索的时候用到CompassTemplate了(CompassTemplate是支持事务的)
<property name="compassImplements">
<ref local="compassImplements"/>
</property>
这样配置就ok了
下面测试一下吧:
新建JUnit测试用例:
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测试一下。
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的操作。
其它具体还是看帮助文档吧。^_^
分享到:
相关推荐
3. `Article.cpm.xml`: 这个文件定义了 `Article` 类与搜索引擎之间的映射规则。它通常使用 XML 格式,详细描述了类的属性如何被索引和检索。例如,文章的标题、内容和发布日期可能会被设置为可搜索的字段。 通过...
【Compass原理深入学习笔记】 Compass是一款基于Apache Lucene的全文搜索引擎框架,它为开发者提供了更高级别的抽象层,简化了搜索引擎的集成工作。在理解Compass之前,我们需要先了解全文检索的基本概念和原理。 ...
其索引结构基于倒排索引,能快速定位到包含特定词汇的文档,使得搜索性能卓越。在学习Lucene时,重点应掌握如何创建索引、执行查询以及优化搜索性能。 接着,我们转向Compass。Compass是一个基于Lucene的全文搜索...
`compass学习笔记.doc`是一份关于Compass的学习文档,可能包含了使用Compass的基本步骤,常见问题解答,以及一些最佳实践。这份文档对于理解Compass的工作原理和实际应用是非常有价值的。 `lucene总结.chm`和`...
此项目对于理解Compass和Lucene在实际应用中的使用,以及如何结合SSH框架开发Java Web应用具有很高的学习价值。通过分析和研究这个项目,开发者可以深入掌握Java全文搜索引擎的实现,以及如何在SSH框架下组织和管理...
在Node.js学习过程中,MongoDB和Compass的结合使用可以帮助你更好地理解和操作数据库。通过Node.js的MongoDB驱动,你可以编写JavaScript代码来与MongoDB交互,创建和查询集合,执行CRUD(创建、读取、更新、删除)...
2. 学习Compass的核心概念,如网格系统、样式库和混入。 3. 实践创建简单项目,应用Compass的功能来编写样式。 4. 阅读官方文档和在线教程,加深理解。 5. 参考其他开发者的工作,了解如何在实际项目中使用Compass。...
学习Compass可以从官方文档开始,了解其基本概念和API用法。此外,网上有许多教程和社区讨论,可以深入学习Compass的高级特性,如优化索引性能、定制分析器等。 总结,Compass作为基于Lucene的搜索引擎框架,为Java...
3. **创建索引**:使用 Compass 提供的 API 创建索引。这通常涉及读取数据源中的信息,然后通过 Compass 将每个文档的关键信息转换为 Lucene 可理解的格式并建立索引。索引过程可以配置为实时、批量或定期执行。 4....
3. **事务支持**:Compass支持JTA(Java Transaction API)和JPA(Java Persistence API)事务管理,这意味着在处理多个搜索操作时,可以确保数据的一致性和完整性。这对于需要在事务环境中运行的复杂应用至关重要。...
本文档总结了Compass和WellPlan的学习笔记,涵盖了油气工业中常用的井trajectory设计和分析、Well Planning和设计等方面的知识点。 一、井trajectory设计和分析 井trajectory设计和分析是油气工业中非常重要的一环...
压缩包内的单一文件“compass_hibernate_spring3”可能是一个包含所有相关配置、源代码、测试以及可能的文档的项目文件夹。用户可能需要解压后导入到 IDE(如 Eclipse 或 IntelliJ IDEA)中,然后按照博客文章中的...
2. 用户手册:PDF文档,详细介绍了软件的使用方法、操作流程和常见问题解答。 3. 更新日志:列出该版本相对于前一版本的改进和修复内容。 4. 配套库和驱动:包含必要的库文件和驱动程序,确保软件与不同GPS设备的...
compass 和 wellplan 学习总结材料 compass 和 wellplan 是油气行业中常用的软件,分别用于钻井设计和油井规划。以下是 compass 和 wellplan 的学习总结材料。 一、compass 的创建 compass 是一款专业的钻井设计...
3. **性能分析**:MongoDB Compass可以监控数据库的性能,包括读写操作、内存使用和磁盘I/O。通过这些信息,用户可以识别性能瓶颈并进行优化。 4. **索引管理**:创建、编辑和删除索引在Compass中变得简单。用户...
Compass是MongoDB官方提供的一个重要组件,它使用户能够直观地与MongoDB交互,无需深入学习复杂的查询语言。 MongoDB Compass的核心功能包括: 1. **数据可视化**:Compass提供了一个清晰的数据视图,将MongoDB...
3. **实现服务层**:创建服务层接口及其实现类,利用Spring的注入机制注入Compass的bean,实现对索引的操作。 #### 五、实际应用案例 假设我们有一个项目管理系统,需要实现项目的快速搜索功能。我们可以采用上述...
《compass:COMPASS 文档和用户手册》是针对 Compass 框架的详细参考资料,它为开发者和用户提供了深入理解及使用 Compass 的关键知识。Compass 是一个强大的 CSS(层叠样式表)预处理器,它扩展了 CSS 语言,使得...
3. **icudtl.dat**:这是一个Unicode数据文件,用于支持MongoDB Compass中的国际化和本地化功能,确保正确处理各种语言和字符集。 4. **node.dll**:这是Node.js的动态链接库,因为MongoDB Compass是基于Node.js构建...
总的来说,MongoDB Compass是MongoDB用户不可或缺的工具,无论是在学习、开发还是日常运维过程中,都能极大地提升工作效率和体验。这个特定的版本号(1.12.8)意味着它包含了截至发布日期的所有已知修复和改进,确保...