Spring Hibernate Session问题
整合Spring,Hibernate在进行DAO操作时,
有一个POJO类Image存放图片。
有一个ImageDAO.insert方法把数据保存至数据库。
如果ImageDAOImpl类继承HibernateDaoSupport类public class ImageDAOImpl extends HibernateDaoSupport implements ImageDAO {
public void insert(Image transientInstance) {
getHibernateTemplate().save(transientInstance);
}
}在进行保存时没有发生异常。正确虽然代码简介,但dao类与spring框架api发生了耦合,一旦脱离Spring框架这些dao代码就得不到重用。
所以把dao类全部基于Hibernate实现,不加入Spring的代码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呢?如果这样效率就高一点。但是碰到的问题是抛出了异常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)在网上找了半天,也没解决问题的办法。请您帮忙解答一下。
谢谢
整合Spring,Hibernate在进行DAO操作时,
有一个POJO类Image存放图片。
有一个ImageDAO.insert方法把数据保存至数据库。
如果ImageDAOImpl类继承HibernateDaoSupport类public class ImageDAOImpl extends HibernateDaoSupport implements ImageDAO {
public void insert(Image transientInstance) {
getHibernateTemplate().save(transientInstance);
}
}在进行保存时没有发生异常。正确虽然代码简介,但dao类与spring框架api发生了耦合,一旦脱离Spring框架这些dao代码就得不到重用。
所以把dao类全部基于Hibernate实现,不加入Spring的代码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呢?如果这样效率就高一点。但是碰到的问题是抛出了异常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)在网上找了半天,也没解决问题的办法。请您帮忙解答一下。
谢谢
解决方案 »
- 小弟没有接触过JSP,请大家帮个忙.jsp页面上如何将后台JAVA代码中list中list集合的数据显示出来?
- 关于javascript无间横向滚动的问题
- 急!tomcat连接池的问题(apache+tomcat)
- 为什么用<fmt:message key="label.username"/>取资源文件里的值时总是显示???label.username??? 这样的字符?
- 急问用eclipse-wtp即eclipse3.1+lomboz+TomcatPlugin无法运行jsp?!
- 正则表达式
- 得到TEXT的VALUES中的值
- 各位高人,救命呀,我快崩溃了,关于frame~~~,分数不多了,见谅~~
- SOS! JSP中该怎样操作主细表?越详细越好!
- 各位高人请指点迷津:提供一本好的入门书
- ****** 在jsp页面include中如何调用Action类
- jsp + sql server2000实现一个搜索功能.请问如何在数据库中取出搜索关键字所在的字段名称
用的时候需要打开,不用的时候要关闭;
也可以用过滤器来实现session的开关。
初学Spring和hibernate
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);
}
}
不好利用你上面那段代码啊
org.springframework.orm.hibernate3.LocalSessionFactoryBean
不知道该怎么办?
只在实现方法的时候才去调用它。
事务开启后要跟Session开启一样,一定要关闭。
public class HibernateImageDAOImpl implements ImageDAO
public calss JDBCImageDAOImpl implements ImageDAO如果过分想着不耦合,那么就什么框架都用不成了。感觉这个问题有点over design。
同意!
封装一个统一的泛类型dao,其他的dao都继承它!
thanks in advance