首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • Spring,Hibernate Session问题 [已结贴,结贴人:xushun]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xushun
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 揭贴率:
    发表于:2008-08-21 15:14:20 楼主
    Spring Hibernate Session问题
    整合Spring,Hibernate在进行DAO操作时,
    有一个POJO类Image存放图片。
    有一个ImageDAO.insert方法把数据保存至数据库。
    如果ImageDAOImpl类继承HibernateDaoSupport类
    Java code
    public class ImageDAOImpl extends HibernateDaoSupport implements ImageDAO { public void insert(Image transientInstance) { getHibernateTemplate().save(transientInstance); } }

    在进行保存时没有发生异常。正确

    虽然代码简介,但dao类与spring框架api发生了耦合,一旦脱离Spring框架这些dao代码就得不到重用。
    所以把dao类全部基于Hibernate实现,不加入Spring的代码
    Java code
    public class ImageHibernateDAO implements ImageDAO { private SessionFactory sessionFactory; public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } public void insert(Image image) { // Session session = sessionFactory.getCurrentSession(); Session session = sessionFactory.openSession(); System.out.println(session); Transaction transaction = session.beginTransaction(); session.save(image); transaction.commit(); } }

    对每次操作都得建立一个session,操作完毕又销毁session,性能方法也有一定的开销。
    SessionFactory.getCurrentSession是不是一个线程对应一个Session呢?如果这样效率就高一点。但是碰到的问题是抛出了异常
    XML code
    Exception in thread "main" org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here at org.springframework.orm.hibernate3.AbstractSessionFactoryBean$TransactionAwareInvocationHandler.invoke(AbstractSessionFactoryBean.java:300) at $Proxy0.getCurrentSession(Unknown Source)

    在网上找了半天,也没解决问题的办法。请您帮忙解答一下。
    谢谢


    30  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • burningice44
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 15:21:121楼 得分:5
    好像是一个事务对应一个session,
    用的时候需要打开,不用的时候要关闭;
    也可以用过滤器来实现session的开关。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xushun
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 15:32:382楼 得分:0
    那该如何配置呢?
    初学Spring和hibernate
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zgxzowen
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 11:15:133楼 得分:10
    如果想这么使用,就要利用ThreadLocal来管理Session,
    public static final SessionFactory sessionFactory;
    static {
    try {
    sessionFactory = new Configuration().configure().buildSessionFactory();
    } catch (Throwable ex) {
    throw new ExceptionInInitializerError(ex);
    }
    }
    public static Session getSession() {
    return (Session) _session.get();
    }

    public static void setSession(Session session) {
    if (session == null) {
    sessionIsActive.set(null);
    } else
    sessionIsActive.set(new Boolean(true));
    _session.set(session);
    }
    public static Transaction getTransaction() {
    return (Transaction) _transaction.get();
    }

    public static void setTransaction(Transaction trans) {
    _transaction.set(trans);
    }

    public static void closeSession() throws HibernateException {
    Transaction tr = (Transaction) getTransaction();
    try {
    if (tr != null && !tr.wasCommitted() && !tr.wasRolledBack()) {
    tr.commit();
    }
    } catch (Exception e) {
    e.printStackTrace();
    } finally {
    setTransaction(null);
    getSession().close();
    setSession(null);
    }
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xushun
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 12:04:294楼 得分:0
    那和Spring框架整合,SessionFactory是Spring提供的
    不好利用你上面那段代码啊
    org.springframework.orm.hibernate3.LocalSessionFactoryBean
    不知道该怎么办?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yojiwei
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-25 13:07:265楼 得分:5
    将SessionFactory从IDAO中分离出来。
    只在实现方法的时候才去调用它。
    事务开启后要跟Session开启一样,一定要关闭。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • idilent
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-29 11:33:126楼 得分:5
    既然用了spring,就不要想不和它耦合,其实你有接口,已经可以了,在不想用spring的时候可以再重新写另外一个实现方法。也就是说一个DAO接口,可以有多个实现类,想用那个用那个。

    public class SpringHibernateImageDAOImpl extends HibernateDaoSupport implements ImageDAO
    public class HibernateImageDAOImpl implements ImageDAO
    public calss JDBCImageDAOImpl implements ImageDAO

    如果过分想着不耦合,那么就什么框架都用不成了。

    感觉这个问题有点over design。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • qintao1203
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-07 18:02:467楼 得分:5
    引用 6 楼 idilent 的回复:
    既然用了spring,就不要想不和它耦合,其实你有接口,已经可以了,在不想用spring的时候可以再重新写另外一个实现方法。也就是说一个DAO接口,可以有多个实现类,想用那个用那个。

    public class SpringHibernateImageDAOImpl extends HibernateDaoSupport implements ImageDAO
    public class HibernateImageDAOImpl implements ImageDAO
    public calss JDBCImageDAOImpl implements ImageDAO

    如果过分想着不耦合,那么…


    同意!
    封装一个统一的泛类型dao,其他的dao都继承它!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xushun
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-13 18:07:438楼 得分:0
    谢谢大家 问题已全都解决了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • significantfrank
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-17 12:21:409楼 得分:0
    hi xushun

      could you tell me how did you solve this problem?  i met the same problem
    thanks in advance
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bumianfeng
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-12 01:01:4110楼 得分:0
    日的哦,你问题解决了也说下怎么解决啊 ,都找了一个星期了,没个解决的办法 ..................................
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved