摘抄自compass API
public interface CompassSession extends CompassOperations, CompassSearchSession, CompassIndexSession
是介于java application 和 Compass直接的一个主要接口。
提供对语义映射对象的基本操作(save,delete 和 load/get).session提供基于对象级别和Resource 级别(已索引的对象模型)的操作。CompassSession的操作室委托于底层的SearchEngine实现的,所以不需要直接访问SearchEngine.
实现并非是线程安全的,每个线程/事务都要从Compass获得它自己的实例。
如果CompassSession抛出一个异常,事务必须回滚并且session要舍弃,如果舍弃,CompassSession内部的状态可能会与搜索引擎的不一致。
使用session依赖于事务是怎么管理的,最简单的形式就像这样:
CompassSession session = compass.openSession(); try { // do operations with the session session.commit(); // same as session.close() } catch (Exception e) { session.rollback(); }
一个更复杂的包括使用CompassTransaction 完整控制的形式
CompassSession session = compass.openSession(); CompassTransaction tx = null; try { tx = session.beginTransaction(); Object result = compassCallback.doInCompass(session); tx.commit(); return result; } catch (RuntimeException e) { if (tx != null) { tx.rollback(); } throw e; } finally { session.close(); }
以下为compass-reference里部分:
1 CompassSession的获取
CompassSession是从compass获得的,compass.openSession();
常用的获取方式:
CompassConfiguration conf = new CompassConfiguration().configure().addClass(Author.class); Compass compass = conf.buildCompass(); CompassSession session = compass.openSession();
2 CompassSession 类型
位于顶部的全功能的CompassSession同时提供了搜索和索引的能力,Compass为搜索或索引提供了简单的API。
CompassSearchSession仅仅提供了搜索的功能,可用于下列方式:
CompassSearchSession session = compass.openSearchSession(); try { ... CompassHits hits = session.find("jack london"); Author a = (Author) hits.data(0); Resource r = hits.resource(0); ... } finally { session.close(); }
CompassIndexSession只提供了索引功能:
CompassIndexSession session = compass.openIndexSession(); try { ... session.save(author); ... session.commit(); } catch (Exception e) { session.rollback(); } finally { session.
3 session生命周期
核心Compass接口用openSession()方法管理者CompassSession的创建,当beginTransaction()被CompassTransaction调用的时候,session就绑定到了所创建的transaction并且在贯穿在transaction的生命周期中使用。它意味着如果一个另外的session 在当前的事务中打开了,那么最初的session将会用openSession() 方法返回。
当使用openSession方法时,Compass将会自动尝试并且结合一个已经运行着的外部事务。一个外部事务可以是一个已运行的本地Compass事务,一个JTA事务,或一个spring管理的事务。如果Compass管理结合一个已存在的外部事务,应用就不需要调用CompassSession的beginTransaction()方法或使用CompassTransaction去管理事务,这就
允许简单化Compass在一个进程中已存在事务的管理环境中的使用,不用要求清晰的Compass代码去管理一个Compass 事务