Compass的数据同步(Data Mirror),实话说,我一直都没有调试成功过。有兴趣的朋友可以参考SpringSide的文档。http://wiki.springside.org.cn/display/springside/Compass。当时曾构思过,不如自已写一个SPRING的AOP来同步?后来做好后居然发现Compass居然也提供了AOP的关于同步的组件。郁闷。下文中,我主要介绍如何使用Compass的AOP和DAO层协作实现我的Data Mirror功能。本文仍延用上一篇文章中的环境,案例。请查阅博客地址:
http://wangwanbao.iteye.com/admin/blogs/368252
一、实现Hibernate的DAO
代码不多,直接给出好了。
public class GenericDaoImpl extends HibernateDaoSupport implements GenericDao {
Session session;
public Session getHibernateSession(){
if(null == session)
session = getSession();
return session;
}
@SuppressWarnings("unchecked")
public List findByHQL(final String hql) {
return (List) getHibernateTemplate().executeWithNativeSession(
new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Query query = session.createQuery(hql);
return query.list();
}
});
}
public <T> List<T> getAll(Class<T> entityClass) {
return this.getHibernateTemplate().loadAll(entityClass);
}
public void deletebyID(Class entityClass, Serializable id) {
this.delete(this.getbyID(entityClass, id));
}
public void deleteByList(Collection con) {
this.getHibernateTemplate().deleteAll(con);
}
public void save(Object o) {
getHibernateTemplate().saveOrUpdate(o);
}
public void delete(Object o) {
this.getHibernateTemplate().delete(o);
}
public <T>T getbyID(Class<T> entityClass, Serializable id) {
Object o = this.getHibernateTemplate().get(entityClass, id);
if (o == null) {
throw new ObjectRetrievalFailureException(entityClass, id);
}
return (T) o;
}
public <T> List<T> findBy(Class<T> entityClass, String name, Object value) {
Assert.hasText(name);
Criteria criteria = getEntityCriteria(entityClass);
criteria.add(Restrictions.eq(name, value));
return criteria.list();
}
public <T> List<T> findByParameters(Class<T> entityClass, String[] name, Object[] value) {
Criteria criteria = getEntityCriteria(entityClass);
for(int i=0;i<name.length;i++){
criteria.add(Restrictions.eq(name[i], value[i]));
}
return criteria.list();
}
protected Criteria getEntityCriteria(Class entityClass) {
return getHibernateSession().createCriteria(entityClass);
}
}
二、Spring的配置文件:
<bean id="compassSaveAdvisor"
class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice">
<bean class="org.compass.spring.aop.CompassSaveAdvice">
<property name="compass" ref="compass" />
</bean>
</property>
<property name="pattern" value=".*save" />
</bean>
<bean id="compassDeleteAdvisor"
class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice">
<bean class="org.compass.spring.aop.CompassDeleteAdvice">
<property name="compass" ref="compass" />
</bean>
</property>
<property name="pattern" value=".*delete" />
</bean>
<bean id="proxyCreator"
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>genericDao</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>compassSaveAdvisor</value>
<value>compassDeleteAdvisor</value>
</list>
</property>
</bean>
其中上面的genericDao指我们的DAO文件的bean。它必须是实现接口的实现,否则的时候在获取genericDao的Bean时,会出现ClassCastException,这是J2se反射的机制。
三、测试代码
GenericDao gd = (GenericDao) factory.getBean("genericDao");
Course course = gd.getbyID(Course.class, 1);
HomeTown ht = gd.getbyID(HomeTown.class, 1);
List<Course> courses = new ArrayList<Course>();
courses.add(course);
Student s = new Student();
s.setName("Jerry");
s.setCourses(courses);
s.setHomeTown(ht);
gd.save(s);
CompassDaoImpl cd = (CompassDaoImpl) factory.getBean("compassDAO");
List<SearchRequest.SearchField> searchFields = new ArrayList<SearchRequest.SearchField>();
SearchRequest.SearchField s1 = new SearchRequest().new SearchField();
s1.setFieldName("Student.name");
s1.setFieldType(Occur.MUST);
s1.setFieldValue("Jerry");
searchFields.add(s1);
SearchRequest sr = new SearchRequest();
sr.setAlias("Student");
sr.setEntityClass(Student.class);
sr.setFields(searchFields);
List<Student> students = cd.searchByOSEM(sr);
if(students.size() <1){
System.out.println("长度为0");
}else{
for(Student sd : students){
System.out.println(sd.getName() + "---" + sd.getHomeTown().getCity());
}
}
}
我们首先通过Dao增中一条学生记录,紧接着,立刻搜索学生,控制台输入内容正确。测试成功!