逻辑删除而不是物理删除,是很常见的需求。我这里是因为要用到 syncml,
所以删掉的联系人也不能真正删除,只能做标记。于是增加一个 status 字段,
如果是 "D"的话,就表示删除。
对于 SmartGWTEE 来说,只要在 datasource 里面定义好了,增删改查
都不用我做。那么,如何用最简单的办法做一个逻辑上的删除?
首先,肯定要自己自定义一个服务端的 DataSource。在 ds.xml 文件当中,
增加这个类的定义:
<DataSource ID="contactPerson" serverType="hibernate" beanClassName="org.simon.pim8.server.contact.ContactPerson" serverConstructor="org.simon.pim8.server.contact.ContactPersonDataSource" >
这里的 serverConstructor 就是自定义的DataSource。
接下来这个DataSource要做的事情,就是从HibernateDataSource 当中继承下来,做一些调整就OK了。
public class ContactPersonDataSource extends HibernateDataSource { @Override public DSResponse execute(DSRequest req) throws Exception { String operationType = req.getOperationType(); Map values = req.getValues(); if ( isUpdate( operationType)) { values.put( "status", "U"); } else if ( isAdd( operationType)) { values.put( "status", "N"); } else if ( isRemove( operationType)) { // 不做真实的删除 values.put( "status", "D"); final Session session = sessionFactory.openSession(); final ContactPerson person = (ContactPerson) session.get( ContactPerson.class, (Serializable) values.get( "id")); person.setStatus( "D"); final Transaction txn = session.beginTransaction(); session.update( person); txn.commit(); session.close(); return new DSResponse(); } else if ( isFetch( operationType)) { Map newCriteria = new HashMap(); newCriteria.put( "_constructor", "AdvancedCriteria"); newCriteria.put( "operator", "and"); List criterias = new ArrayList(); Map notDelete = new HashMap(); notDelete.put( "fieldName", "status"); notDelete.put( "operator", "notEqual"); notDelete.put( "value", "D"); criterias.add( notDelete); if ( isAdvancedCriteria( req.getCriteria())) { criterias.add( req.getCriteria()); } newCriteria.put( "criteria", criterias); req.setCriteria( newCriteria); } return super.execute( req); } }
这里,除了删除之外,实际上的工作都由父类完成,我只是做一些设置,改变父类的行为。
增加和新增不用多说。删除的话,设置状态,然后手工更新,就可以直接退出了。
本来想把 operationType设置为 update的。后来想还是算了,简单点好。
查询是最有意思的。因为要增加一个不等于"D"的criteria,所以只能按照 SmartGWTEE的
AdvancedCriteria格式,来做这样一个动作。
另外,提醒一下,status这个字段,也要添加到 ds.xml 文件当中,否则在过滤时,不会起作用的。