Spring如何注入Session对象
答案:2 悬赏:50
解决时间 2021-03-06 12:19
- 提问者网友:残阳碧曼
- 2021-03-06 06:10
最近在网上看到的都是Spring管理的sessionfactory对象,我想问下Spring如何实现注入一个Session对象?本人菜鸟希望大侠不吝赐教
最佳答案
- 二级知识专家网友:心痛成瘾
- 2021-03-06 07:05
应该是注入HibernateTemplate吧
然后使用HibernateTemplate对象
HibernateTemplate的常用方法:
voiddelete(Objectentity): 删除指定持久化实例。
deleteAll(Collection entities): 删除集合内全部持久化类实例。
find(String queηString): 根据 HQL 查询字符串来返回实例集合。
findByNamedQuery(String queryName): 根据命名查询返回实例集合。
get(ClassentityClass,Serializable id): 根据主键加载特定持久化类的实例。
save(Objectentity): 保存新的实例。
saveOrUpdate(Objectentity): 根据实例状态,选择保存或者更新。
update(Objectentity): 更新实例的状态,要求entity 是持久状态。
setMaxResults(intmaxResults): 设置分页的大小。
呵呵,就这么多吧,不知道有没有用,好久没用Java了
然后使用HibernateTemplate对象
HibernateTemplate的常用方法:
voiddelete(Objectentity): 删除指定持久化实例。
deleteAll(Collection entities): 删除集合内全部持久化类实例。
find(String queηString): 根据 HQL 查询字符串来返回实例集合。
findByNamedQuery(String queryName): 根据命名查询返回实例集合。
get(ClassentityClass,Serializable id): 根据主键加载特定持久化类的实例。
save(Objectentity): 保存新的实例。
saveOrUpdate(Objectentity): 根据实例状态,选择保存或者更新。
update(Objectentity): 更新实例的状态,要求entity 是持久状态。
setMaxResults(intmaxResults): 设置分页的大小。
呵呵,就这么多吧,不知道有没有用,好久没用Java了
全部回答
- 1楼网友:甜野猫
- 2021-03-06 08:12
在利用spring + hibernate进行开发时也是如此。下面是一个简单的spring + hibernate dao的例子:程序代码public class daoreal extends hibernatedaosupport implements dao {
public list getall() {
return super.gethibernatetemplate().find("from user"); }} 在上面的这个例子中,我们并没有关闭session,但程序并没有任何问题,那是因为spring已经帮我们关闭了。那么再看一个例子:程序代码public class daoreal extends hibernatedaosupport implements dao {
public list getall() {
????????return super.getsession().createquery("from user").list(); }} 这个例子会不会有问题呢?的确,上面的例子中隐藏了一个问题,数据库连接并没有被关闭,在我们的印象中这件事似乎应该是spring的。程序执行后,好像也没有什么问题,但是连续执行该语句n次(n<=最大连接数,如果没有指定最大连接数,那么默认为10次)后,系统处于等待状态,不会继续执行了,控制台上并没有输出任何信息。打开log文件,发现系统抛出java.lang.illegalstateexception: pool not open的异常,无法打开连接。这说明系统连接池中所有的连接都在使用中。那么我们手动关闭session后,应该就没有问题了吧!是这样吗?修改我们的例子,如下:程序代码public class daoreal extends hibernatedaosupport implements dao {
public list getall() {
session s = super.getsession();
try {
return s.createquery("from user").list();
} finally {
s.close(); } }} 执行n遍后依然停止响应。问题出在哪里呢?其实spring的session总是与某个线程绑定的,而这个线程往往就是承载servlet或jsp的那个线程,也就是说,它的生命周期scope是request的。在上面的例子中,我们利用getsession强制获得了hibernate的session,这个session可能是当前事务中之前使用过的,或者可能是一个新的,并不在当前事务中,spring只对当前事务中的session进行关闭。
要解决这个问题,方法有很多。可以使用我们之前讲到过的gethibernatetemplate().find()。也可以设定hibernatetemplate的allowcreate为true,并在finally中关闭session。也可以将true作为参数传递到super.getsession(..)方法中取得session。这里的true表示允许创建。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯