Hibernate Search牛刀小试
??? ??? 前几天看到Hibernate与Lucene的整合框架Hiberate Search3.0.0.GA版出来了,昨天试这写了一个Demo,感觉用起来的确很方便的,贴出来与大家分享一下。
1、创建POJO
java 代码?
- @Entity??
- @Table(name?=?"employee",?catalog?=?"hise",?uniqueConstraints?=?{})??
- @Indexed(index?=?"indexes/employee")??
- public?class?Employee?implements?java.io.Serializable?{??
- ????private?static?final?long?serialVersionUID?=?7794235365739814541L;??
- ????private?Integer?empId;??
- ????private?String?empName;??
- ????private?Department?dept;??
- ????private?String?empNo;??
- ????private?Double?empSalary;??
- ??
- ????//?Constructors??
- ??
- ????/**?default?constructor?*/??
- ????public?Employee()?{??
- ????}??
- ??
- ????/**?minimal?constructor?*/??
- ????public?Employee(Integer?empId)?{??
- ????????this.empId?=?empId;??
- ????}??
- ??
- ????/**?full?constructor?*/??
- ????public?Employee(Integer?empId,?String?empName,??
- ????????????String?empNo,?Double?empSalary)?{??
- ????????this.empId?=?empId;??
- ????????this.empName?=?empName;??
- ????????this.empNo?=?empNo;??
- ????????this.empSalary?=?empSalary;??
- ????}??
- ??
- ????//?Property?accessors??
- ????@Id??
- ????@GeneratedValue(strategy?=?GenerationType.AUTO)??
- ????@Column(name?=?"emp_id",?unique?=?true,?nullable?=?false,?insertable?=?true,?updatable?=?true)??
- ????@DocumentId??
- ????public?Integer?getEmpId()?{??
- ????????return?this.empId;??
- ????}??
- ??
- ????public?void?setEmpId(Integer?empId)?{??
- ????????this.empId?=?empId;??
- ????}??
- ??
- ????@Column(name?=?"emp_name",?unique?=?false,?nullable?=?true,?insertable?=?true,?updatable?=?true,?length?=?30)??
- ????@Field(name="name",?index=Index.TOKENIZED,?store=Store.YES)??
- ????public?String?getEmpName()?{??
- ????????return?this.empName;??
- ????}??
- ??
- ????public?void?setEmpName(String?empName)?{??
- ????????this.empName?=?empName;??
- ????}??
- ??
- ????@Column(name?=?"emp_no",?unique?=?false,?nullable?=?true,?insertable?=?true,?updatable?=?true,?length?=?30)??
- ????@Field(index=Index.UN_TOKENIZED)??
- ????public?String?getEmpNo()?{??
- ????????return?this.empNo;??
- ????}??
- ??
- ????public?void?setEmpNo(String?empNo)?{??
- ????????this.empNo?=?empNo;??
- ????}??
- ??
- ????@Column(name?=?"emp_salary",?unique?=?false,?nullable?=?true,?insertable?=?true,?updatable?=?true,?precision?=?7)??
- ????public?Double?getEmpSalary()?{??
- ????????return?this.empSalary;??
- ????}??
- ??
- ????public?void?setEmpSalary(Double?empSalary)?{??
- ????????this.empSalary?=?empSalary;??
- ????}??
- ??
- ????@ManyToOne(cascade?=?CascadeType.ALL)??
- ????@JoinColumn(name="dept_id")??
- ????@IndexedEmbedded(prefix="dept_")??
- ????public?Department?getDept()?{??
- ????????return?dept;??
- ????}??
- ??
- ????public?void?setDept(Department?dept)?{??
- ????????this.dept?=?dept;??
- ????}??
- }??
- @Entity??
- @Table(name?=?"department",?catalog?=?"hise",?uniqueConstraints?=?{})??
- @Indexed(index="indexes/department")??
- public?class?Department?implements?java.io.Serializable?{??
- ????private?static?final?long?serialVersionUID?=?7891065193118612907L;??
- ????private?Integer?deptId;??
- ????private?String?deptNo;??
- ????private?String?deptName;??
- ????private?List<Employee>?empList;??
- ??
- ????//?Constructors??
- ??
- ????@OneToMany(mappedBy="dept")??
- ????@ContainedIn??
- ????public?List<Employee>?getEmpList()?{??
- ????????return?empList;??
- ????}??
- ??
- ????public?void?setEmpList(List<Employee>?empList)?{??
- ????????this.empList?=?empList;??
- ????}??
- ??
- ????/**?default?constructor?*/??
- ????public?Department()?{??
- ????}??
- ??
- ????/**?minimal?constructor?*/??
- ????public?Department(Integer?deptId)?{??
- ????????this.deptId?=?deptId;??
- ????}??
- ??
- ????/**?full?constructor?*/??
- ????public?Department(Integer?deptId,?String?deptNo,?String?deptName)?{??
- ????????this.deptId?=?deptId;??
- ????????this.deptNo?=?deptNo;??
- ????????this.deptName?=?deptName;??
- ????}??
- ??
- ????//?Property?accessors??
- ????@Id??
- ????@GeneratedValue(strategy=GenerationType.AUTO)??
- ????@Column(name?=?"dept_id",?unique?=?true,?nullable?=?false,?insertable?=?true,?updatable?=?true)??
- ????@DocumentId??
- ????public?Integer?getDeptId()?{??
- ????????return?this.deptId;??
- ????}??
- ??
- ????public?void?setDeptId(Integer?deptId)?{??
- ????????this.deptId?=?deptId;??
- ????}??
- ??
- ????@Column(name?=?"dept_no",?unique?=?false,?nullable?=?true,?insertable?=?true,?updatable?=?true,?length?=?30)??
- ????public?String?getDeptNo()?{??
- ????????return?this.deptNo;??
- ????}??
- ??
- ????public?void?setDeptNo(String?deptNo)?{??
- ????????this.deptNo?=?deptNo;??
- ????}??
- ??
- ????@Column(name?=?"dept_name",?unique?=?false,?nullable?=?true,?insertable?=?true,?updatable?=?true,?length?=?30)??
- ????@Field(name="name",?index=Index.TOKENIZED,store=Store.YES)??
- ????public?String?getDeptName()?{??
- ????????return?this.deptName;??
- ????}??
- ??
- ????public?void?setDeptName(String?deptName)?{??
- ????????this.deptName?=?deptName;??
- ????}??
- }??
??? ??? Hibernate Search相关的Annotation主要有两个:
??? ?? ? @Indexed?? ?? ? ??? ??? 标识需要进行索引的对象,
??? ???? 属性??? ??? index??? ???? 指定索引文件的路径
??? ?? ?? @Field?? ?? ?? ?? ?? ?? ?? 标注在类的get属性上,标识一个索引的Field
??? ??? ? 属性?????? index???????? 指定是否索引,与Lucene相同
??? ??? ??? ??? ??? ???? store???????? 指定是否索引,与Lucene相同
??? ?? ?? ?? ?? ?? ?? ?? name??????? 指定Field的name,默认为类属性的名称
??? ?? ?? ?? ?? ?? ?? ?? analyzer??? 指定分析器
???????? 另外@IndexedEmbedded? 与? @ContainedIn 用于关联类之间的索引
??? ?? ?? @IndexedEmbedded有两个属性,一个prefix指定关联的前缀,一个depth指定关联的深度
??? ?? ?? 如上面两个类中Department类可以通过部门名称name来索引部门,在Employee与部门关联的前缀为dept_,因此可以通过部门名称dept_name来索引一个部门里的所有员工。
2、配置文件
xml 代码?
- <?xml?version='1.0'?encoding='UTF-8'?>??
- <!DOCTYPE?hibernate-configuration?PUBLIC??
- ??????????"-//Hibernate/Hibernate?Configuration?DTD?3.0//EN"??
- ??????????"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">??
- ??
- <hibernate-configuration>??
- ??
- <session-factory>??
- ????<property?name="hibernate.dialect">??
- ????????org.hibernate.dialect.MySQLDialect??
- ????</property>??
- ????<property?name="hibernate.connection.url">??
- ????????jdbc:mysql://localhost:3306/hise??
- ????</property>??
- ????<property?name="hibernate.connection.username">root</property>??
- ????<property?name="hibernate.connection.password">123456</property>??
- ????<property?name="hibernate.connection.driver_class">??
- ????????com.mysql.jdbc.Driver??
- ????</property>??
- ??
- ????<property?name="hibernate.search.default.directory_provider">??
- ????????org.hibernate.search.store.FSDirectoryProvider??
- ????</property>??
- ????<property?name="hibernate.search.default.indexBase">e:/index</property>??
- ??????
- ????<mapping?class="com.yehui.Employee"?/>??
- ????<mapping?class="com.yehui.Department"?/>??
- </session-factory>??
- ??
- </hibernate-configuration>??
如果使用JPA,配置文件为
xml 代码?
- <?xml?version="1.0"?encoding="UTF-8"?>??
- <persistence?xmlns="http://java.sun.com/xml/ns/persistence"??
- ????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
- ????xsi:schemaLocation="http://java.sun.com/xml/ns/persistence??
- ????http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"?version="1.0">??
- ??????
- ????<persistence-unit?name="jpaPU"?transaction-type="RESOURCE_LOCAL">??
- ????????<provider>org.hibernate.ejb.HibernatePersistence</provider>??
- ????????<class>com.yehui.Department</class>??
- ????????<class>com.yehui.Employee</class>??
- ????????<properties>??
- ????????????<property?name="hibernate.connection.driver_class"??
- ????????????????value="com.mysql.jdbc.Driver"?/>??
- ????????????<property?name="hibernate.connection.url"??
- ????????????????value="jdbc:mysql://localhost:3306/hise"?/>??
- ????????????<property?name="hibernate.connection.username"?value="root"?/>??
- ????????????<property?name="hibernate.connection.password"??
- ????????????????value="123456"?/>??
- ????????????<property?name="hibernate.search.default.directory_provider"???
- ????????????????value="org.hibernate.search.store.FSDirectoryProvider"/>??
- ????????????<property?name="hibernate.search.default.indexBase"???
- ????????????????value="e:/index"/>??
- ????????</properties>??
- ????</persistence-unit>??
- ??
- </persistence>??
3、测试代码
java 代码?
- public?class?SearchResultsHibernate?{??
- ????private?static?SessionFactory?sf?=?null;??
- ????private?static?Session?session?=?null;??
- ????private?static?Transaction?tx?=?null;??
- ??
- ????@BeforeClass??
- ????public?static?void?setupBeforeClass()?throws?Exception?{??
- ????????sf?=?new?AnnotationConfiguration().configure("hibernate.cfg.xml").buildSessionFactory();??
- ??
- ????????assertNotNull(sf);??
- ????}??
- ??
- ????@Before??
- ????public?void?setUp()?throws?Exception?{??
- ????????session?=?sf.openSession();??
- ????????tx?=?session.beginTransaction();??
- ????????tx.begin();??
- ????}??
- ??
- ????@After??
- ????public?void?tearDown()?throws?Exception?{??
- ????????tx.commit();??
- ????????session.close();??
- ????}??
- ??
- ????public?static?void?tearDownAfterClass()?throws?Exception?{??
- ????????if?(sf?!=?null)??
- ????????????sf.close();??
- ????}??
- ??
- ????@Test??
- ????public?void?testAddDept()?throws?Exception?{??
- ????????Department?dept?=?new?Department();??
- ????????dept.setDeptName("Market");??
- ????????dept.setDeptNo("6000");??
- ??
- ????????Employee?emp?=?new?Employee();??
- ????????emp.setDept(dept);??
- ????????emp.setEmpName("Kevin");??
- ????????emp.setEmpNo("KGP1213");??
- ????????emp.setEmpSalary(8000d);??
- ??????????
- ????????session.save(emp);??
- ????}??
- ??
- ????@Test??
- ????public?void?testFindAll()?throws?Exception?{??
- ????????Query?query?=?session.createQuery("from?Department");??
- ??
- ????????List<Department>?deptList?=?query.list();??
- ??
- ????????assertTrue(deptList.size()?>?0);??
- ????}??
- ??????
- ????@Test??
- ????public?void?testIndex()?throws?Exception?{??
- ????????FullTextSession?fullTextSession?=?Search.createFullTextSession(session);??
- ????????assertNotNull(session);??
- ??
- ????????QueryParser?parser?=?new?QueryParser("name",?new?StopAnalyzer());??
- ????????org.apache.lucene.search.Query?luceneQuery?=?parser??
- ????????????????.parse("name:Kevin");??
- ????????Query?hibQuery?=?fullTextSession.createFullTextQuery(luceneQuery,??
- ????????????????Employee.class);??
- ??
- ????????List?list?=?hibQuery.list();??
- ????????assertTrue(list.size()?>?0);??
- ????}??
- }??
??? 测试通过。OK 1 楼 dengyin2000 2007-09-30 LZ, 知道compass这个项目吗? 我想知道这个跟compass比 有什么优势。 2 楼 suxy 2007-09-30 个人感觉hibernate search的优势在于非常简单,非常便捷地支持集群
感觉compass的优势在于通用性好,基本上所有的orm和jdbc都支持,hibernate search只支持hibernate和jpa.另外compass为索引的存储也提供了更多的选择。
hibernate search我只看过文档,compass只看过文档目录,不知道说的是否正确,呵呵。
3 楼 simen_net 2008-05-23 不好意思 问个简单的问题 使用你的代码后在
@Table(name = "employee", catalog = "hise", uniqueConstraints = {})
提示 the table employee can not be found on databases 4 楼 qinliyi123 2008-09-24 不好意思啊??
我也在测试hibernate search ,我是把他和spring结合起来用的;但是在测试时,类的索引是建立了,也随着HIBERNATE另外的表变化而变化,就是在测试
public void testIndex() throws Exception {
FullTextSession fullTextSession = Search.createFullTextSession(session);
assertNotNull(session);
QueryParser parser = new QueryParser("name", new StopAnalyzer());
org.apache.lucene.search.Query luceneQuery = parser
.parse("name:Kevin");
Query hibQuery = fullTextSession.createFullTextQuery(luceneQuery,
Employee.class);
List list = hibQuery.list();
assertTrue(list.size() > 0);
}
查询类的时候,org.apache.lucene.search.Query 这个对象一直是空,我用Query .tosting()打印不出值来??所以后面的查询就不会得到查询结果。能否给我解释下我错在什么地方吗???
我的联系方式qq 354109045
在此先谢谢了。