把你的dao的代码贴上来。。
dao有没继承  HibernateDaoSupport ?

解决方案 »

  1.   

    BaseDAO的代码:/*
     * @(#)BaseDAO.java
     *
     * Copyright (c) 2008 onest Inc.
     * All Rights Reserved.
     *
     * 作用:基类DAO
     * 注意事项:
     * Create by  Jun 4, 2008 v 1.0
     * LastUpdate by  Jun 4, 2008  v 1.0
     */package com.onest.treatsms.dao.Impl;import java.lang.reflect.ParameterizedType;
    import java.lang.reflect.Type;
    import java.sql.PreparedStatement;
    import java.util.Map;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map.Entry;
    import java.io.Serializable;import org.apache.log4j.Logger;
    import org.hibernate.Criteria;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.criterion.CriteriaSpecification;
    import org.hibernate.criterion.Example;
    import org.hibernate.criterion.MatchMode;
    import org.hibernate.criterion.Order;
    import org.hibernate.criterion.Projections;
    import org.hibernate.criterion.Restrictions;
    import com.onest.treatsms.dao.IBaseDAO;
    import com.onest.treatsms.exception.SystemException;
    import com.onest.treatsms.utils.OrderEnum;
    import com.onest.treatsms.utils.PageSupport;
    public abstract class BaseDAO<T, ID extends Serializable> implements
    IBaseDAO<T, ID> { private SessionFactory sessionFactory;
    private Class poClass;
    private static final Logger log = Logger.getLogger(BaseDAO.class);
    private static final int WHERE_EQ = 0; // 相等
    private static final int WHERE_LIKE_ALL = 1; // 全LIKE
    private static final int WHERE_IN = 2; // IN查询
    private static final int NOT_NULL = 3; // 不为空
    public BaseDAO() {
    Type type = this.getClass().getGenericSuperclass();
    if (type instanceof ParameterizedType) {
    poClass = (Class) ((ParameterizedType) type)
    .getActualTypeArguments()[0];
    } else {
    throw new RuntimeException(this.getClass().getName()
    + "没有指定继承的po类型");
    }
    } public Class getPoClass() {
    return poClass;
    } public void setPoClass(Class poClass) {
    this.poClass = poClass;
    } public SessionFactory getSessionFactory() {
    return sessionFactory;
    } public void setSessionFactory(SessionFactory sessionFactory) {
    this.sessionFactory = sessionFactory;
    }

    public Session getSession() {
    //return sessionFactory.getCurrentSession();
    return sessionFactory.openSession();
    }
    /*
    private static final ThreadLocal<Session> sessionthreadLocal = new ThreadLocal<Session>();
    private static final ThreadLocal<Transaction> tranThreadLocal = new ThreadLocal<Transaction>();
    private static final int TRAN_TIME_OUT = 20;
        public Session getSession() {
            Session session = sessionthreadLocal.get();
    if (session == null || !session.isOpen()) {
    session = sessionFactory.openSession();
    sessionthreadLocal.set(session);
    log.debug("open session");
    }
            return session;
        }
     */
    // ===================================CRUD==================
    public boolean insert(T instance) throws Exception {

    try {
    Session sess = getSession();
    sess.save(instance);
    return true;
    } catch (Exception e) {
    e.printStackTrace();
    throw new SystemException("数据库操作失败!" + e.getMessage());
    }
    /*
    PreparedStatement st = getSession().connection().prepareStatement("insert into SMS_CENTER(ID," +
    "USER_NAME) values(21, '111')");
    st.execute();
    st = getSession().connection().prepareStatement("insert into SMS_CENTER(ID," +
    "USER_NAME) values(10, '111')");
    st.execute();
     */
    } public boolean update(T instance) throws Exception {
    try {
    Session sess = getSession();
    sess.update(instance);
    return true;
    } catch (Exception e) {
    e.printStackTrace();
    throw new SystemException("数据库操作失败!");
    }
    } public T findById(ID id) {
    try {
    return (T) getSession().get(poClass, id);
    } catch (Exception e) {
    log.error(e.getMessage());
    throw new SystemException("数据库操作异常");
    }
    }
    }
      

  2.   

    我的DAO没继承HibernateDaoSupport ,而是自己写了个BASEDAO,上面只是部分代码,因为
    论坛提示内容过长,我只截取其中一小部分。
      

  3.   

    你必须判断是不是一个新的session,如果该类之前创建过session,你又没做判断,他会认为你会用老session继续操作你可以去看下Spring中HibernateTemplet这个类的源代码,里面有判断session的方法正如1楼所说,你可以继承HibernateDaoSupport这个类,他其中用到的getHibernateTemplet()方法其实就是返回个HibernateTemplet实例,但要注意继承HibernateDaoSupport后就不要在类里写sessionFactory的set方法了,因为
    HibernateDaoSupport已经封装过了,继承过来就行了,但要Spring配置文件里写对属性名