最近写了段代码,如下:
List list = new ArrayList();
Session session = getSession();
Transaction tx = session.beginTransaction();
for(A base:list){
session.save(base);
}
//查询重复sql
tx.commit();
String sql = "select * from a_tmp ";
Query query = session.createSQLQuery(sql);
list = query.list();
// session.close();
return list;有一个对象A,通过session.save保存到对应的临时表a_tmp中,临时表属性为GLOBAL TEMPORARY TABLE ,ON COMMIT PRESERVE ROWS。
问题出现了,如果加上注释的那一句(session.close()),则每次调用这个方法,得到的list都会递增,相当于每次调用这个方法,像临时表中插入的数据都会一直保存下去,但是想达到的效果是,方法调用一次结束后,临时表中的值自动truncate掉,试了下把注释那句session.close()去掉,就能达到这个效果,即每次进入方法向临时表插入数据,方法结束后删除数据。
请问session.close()在这起的作用是什么?
List list = new ArrayList();
Session session = getSession();
Transaction tx = session.beginTransaction();
for(A base:list){
session.save(base);
}
//查询重复sql
tx.commit();
String sql = "select * from a_tmp ";
Query query = session.createSQLQuery(sql);
list = query.list();
// session.close();
return list;有一个对象A,通过session.save保存到对应的临时表a_tmp中,临时表属性为GLOBAL TEMPORARY TABLE ,ON COMMIT PRESERVE ROWS。
问题出现了,如果加上注释的那一句(session.close()),则每次调用这个方法,得到的list都会递增,相当于每次调用这个方法,像临时表中插入的数据都会一直保存下去,但是想达到的效果是,方法调用一次结束后,临时表中的值自动truncate掉,试了下把注释那句session.close()去掉,就能达到这个效果,即每次进入方法向临时表插入数据,方法结束后删除数据。
请问session.close()在这起的作用是什么?
(new DeptPo(1,”行政部”,20,”行政相关”),该po的实例和session没有关联,该po的实例处于transient)
persistent:持久化状态
(和数据库中记录想影射的Po实例,它的状态是persistent, 通过get和load等得到的对象都是persistent)
detached:脱管状态或者游离态
(1)当通过get或load方法得到的po对象它们都处于persistent,但如果执行delete(po)时(但不能执行事务),该po状态就处于detached, (表示和session脱离关联),因delete而变成游离态可以通过save或saveOrUpdate()变成持久态
(2)当把session关闭时,session缓存中的persistent的po对象也变成detached
因关闭session而变成游离态的可以通过lock、save、update变成持久态
持久态实例可以通过调用 delete()变成脱管状态。
通过get()或load()方法得到的实例都是持久化状态的。
脱管状态的实例可以通过调用lock()或者replicate()进行持久化。save()和persist()将会引发SQL的INSERT,delete()会引发SQLDELETE,
而update()或merge()会引发SQL UPDATE。对持久化(persistent)实例的修改在刷新提交的时候会被检测到,它也会引起SQL UPDATE。
saveOrUpdate()或者replicate()会引发SQLINSERT或者UPDATE