org.hibernate.SharedSessionContract
方法共享在Session与StatelessSession之间的契约。 org.hibernate.Session 运行时在java应用和hibernate之间的借口,是核心API类抽象概念持久性服务。 Session生命周期是由开始到结束逻辑事务(长事务可能跨越多个数据库事务)。 Session的主要功能是提供create,read和remove操作为映射实体类的实例,这些实例可能存在如下3种状态之一: transient:从不持久,不需要任何Session关联。 persistent:使用一个唯一的Session关联。 detached:预先持久,不需要任何Session关联。 transient的实例可以调用save(),persist()or saveOrUpdate()成为persistent。 persistent实例可以调用delete()成为transient。 任何调用get()or load()返回的实例是persistent。 detached实例可以通过调用update()、saveOrUpdate()、lock()or replicate()成为persistent。 transient和detached实例状态可以通过调用merge()作为一个新的persistent实例成为persistent。 它并不刻意实现是线程安全的。反而每个线程/事务应该从SessionFactory获取自己的实例。 若Session的持久化类是可序列化则该Session的实例是可序列化的。 通常一个事务使用如下: Session sess = factory.openSession(); Transaction tx; try { tx = sess.beginTransaction(); //do some work ... tx.commit(); }catch (Exception e) { if (tx!=null) tx.rollback(); throw e; } finally { sess.close(); } 如果Session抛出异常,这个事务被回滚并且session被丢弃,Session内部状态可能和数据库异常发生后不一致。 org.hibernate.Criteria 一个简化API为检索实体通过组成条件对象,这是非常方便的方法类似于搜索屏幕上可变的条件被放置在结果集。 Session是其factory,Criterion实例通常通过Restrictions上的一个工厂方法获得: List cats = session.createCriteria(Cat.class) .add( Restrictions.like("name", "Iz%") ) .add( Restrictions.gt( "weight", new Float(minWeight) ) ) .addOrder( Order.asc("age") ) .list(); 可以导航关联使用createAlias() or createCriteria()。 List cats = session.createCriteria(Cat.class) .createCriteria("kittens") .add( Restrictions.like("name", "Iz%") ) .list(); List cats = session.createCriteria(Cat.class) .createAlias("kittens","kit") .add( Restrictions.like("kit.name", "Iz%") ) .list(); 可以指定projection和aggregation使用Projection实例获得,通过使用Projection的工厂方法: List cats = session.createCriteria(Cat.class) .setProjection( Projections.projectionList() .add( Projections.rowCount() ) .add( Projections.avg("weight") ) .add( Projections.max("weight") ) .add( Projections.min("weight") ) .add( Projections.groupProperty("color") ) ) .addOrder( Order.asc("color") ) .list();