请问:hibernate里的session如何正确关闭

山城忙碌人 2010-09-26 09:43:12
rt:
public class Test{
Configuration con = new Configuration().configure("hibernate.cfg.xml");
SessionFactory sf = con.buildSessionFactory();
Transaction tx = null;

public void test(){
String sql = "";
String sql1 = "";
String sql2 = "";
String sql3 = "";

Session session = sf.openSession();
tx = session.beginTransaction();
tx.begin();
try {
session.createQuery(sql).executeUpdate();
session.createQuery(sql1).executeUpdate();
session.createQuery(sql3).executeUpdate();
session.createQuery(sql4).executeUpdate();
tx.commit();
}
catch (Exception e){
tx.rollback();
}
finally {
if (session != null) {
session.close();
}
}
}

}
请问如何正确关闭这里的session.应该关几次。是我执行完第一个修改后就需要关闭一次吗,这样关闭有问题吗?如果有,请问出在哪。正确的应该怎么操作。谢谢。
...全文
473 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
跑路的蛤蟆 2010-09-26
  • 打赏
  • 举报
回复
关闭时分情况:
如果不使用spring托管时:
1、如果没有表关联,直接在你的方法中关闭就行了
2、有表关联,存在延迟加载的话,将关闭代码封在一个方法里

如果使用spring托管

1、如果没有表关联,不用管
2、有关联,在web.xml中加入监听器,其余不用管了
hardycheng 2010-09-26
  • 打赏
  • 举报
回复
因为你用的hibernate方式来使用session,所以session 必须得自己手动关闭。

如果用spring托管的话,那么获取session就是用hibernateTemplete()。getsession()这样来回去Session。


然后 dao最好是进行数据库操作好,避免和业务有关联。

然后用一个service层来专门处理业务逻辑,这样的话 把事务配置对应到service的接口上就行。

对于session, spring里面的session是自己创建,关闭不需要关心,除非使用hibernate的sessionfactory来opSession方式获取的,那么必须自己手动关闭。
LeeJah163 2010-09-26
  • 打赏
  • 举报
回复
extends HibernateDaoSupport
用Spring来管理数据源和事务吧...

<!-- TransactionManager事务管理器 -->
<bean id="myTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<tx:annotation-driven transaction-manager="myTransactionManager"/>
山城忙碌人 2010-09-26
  • 打赏
  • 举报
回复
我方法的名字是以is开头的。
<tx:method name="is*" propagation="REQUIRED" />

这里已经提定事务。就是不起用。。。
山城忙碌人 2010-09-26
  • 打赏
  • 举报
回复
我不知道为什么我的事务不起用。
youjianbo_han_87 2010-09-26
  • 打赏
  • 举报
回复
session.close();
kerioz 2010-09-26
  • 打赏
  • 举报
回复
个人建议使用spring来管理事务和session
山城忙碌人 2010-09-26
  • 打赏
  • 举报
回复
我有一个问题啊。我是修改三次记录。我想通过修改后的返回值来决定事务提交还是回滚。应该怎么做。我看session.createQuery(sql3).executeUpdate();这样我应该怎么做呢。。
山城忙碌人 2010-09-26
  • 打赏
  • 举报
回复
<!--定义哪些方法需要加事务 配置事务传播特性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="is*" propagation="REQUIRED" />
<tx:method name="find*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="*" read-only="false" />
</tx:attributes>
</tx:advice>

<!--定义使用事务的方法的路径 那些类使用事务 -->
<aop:config>
<aop:pointcut id="cimSms"
expression="execution(* com.test.dao.*.*(..))" />
//请问这里的路径应该指向。dao还是daoImpl啊
<aop:advisor advice-ref="txAdvice" pointcut-ref="cimSms" />
</aop:config>


我这样配置的。但事务不想效果。。。。
山城忙碌人 2010-09-26
  • 打赏
  • 举报
回复
licip 是实际项目。这是业务层里的啊。
这个类 extends HibernateDaoSupport implements
testDao

我也想用hibernate 的事务。我不会配。事务不起效果。晕。只有用hibernate的session了。
licip 2010-09-26
  • 打赏
  • 举报
回复
如果在实际的项目中的话,关闭的操作应该放到务业层中。

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧