先把代码贴出来吧! 逻辑操作类ServiceImpl.java
 public boolean createKind(String kindName,String kindDesc) throws ServiceException
{

 Session sess = null;
 Transaction tr = null;
 try
 {
 KindDaoInterf kdi = (KindDaoInterf)DaoFactory.instance().getDao("kindDao");
 sess = HibernateSessionFactory.getSession();
 tr = sess.beginTransaction();
 if(kdi.get(sess, kindName)!=null) throw new ServiceException("该类别已经存在");
 Kind kind = new Kind();
          kind.setKindName(kindName);
 kind.setKindDesc(kindDesc);
 kdi.save(sess, kind);
 tr.commit();
 return true;
 }
 catch(Exception e)
 {
 tr.rollback();
 throw new ServiceException(e.getMessage()+"0");
 }
 finally
 {
 HibernateSessionFactory.closeSession();
 }
}
  KindDaoImpl.java 
   package cn.alavu.dao;import org.hibernate.Session;import cn.alavu.dao.interf.KindDaoInterf;
import cn.alavu.model.Kind;public class KindDaoImpl implements KindDaoInterf {
public void save(Session sess,Kind kind)
{
sess.save(kind);
}
public void update(Session sess,Kind kind)
{
 sess.update(kind);
}
public Kind get(Session sess,String kindName)
{
return (Kind)sess.load(Kind.class, kindName);
}
public  void delete(Session sess,String kindName)
{
sess.delete(sess.get(Kind.class, kindName));
}
public  void delete(Session sess,Kind kind)
{
sess.delete(kind);
}
KindDaoInterf.java
 package cn.alavu.dao.interf;import cn.alavu.dao.base.Dao;
import org.hibernate.*;import cn.alavu.model.Kind;
public interface KindDaoInterf extends Dao {
     
  void save(Session sess,Kind kind);
  void update(Session sess,Kind kind);
  Kind get(Session sess,String kindName);
  void delete(Session sess,String kindName);
  void delete(Session sess,Kind kind);
}
出现问题:
  javax.servlet.ServletException: 该类别已经存在
org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:545)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:486)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
cn.alavu.util.EncodeServlet.process(EncodeServlet.java:13)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
root cause cn.alavu.exception.ServiceException: 该类别已经存在
cn.alavu.service.ServiceImpl.createKind(ServiceImpl.java:73)
cn.alavu.action.KindAddAction.execute(KindAddAction.java:45)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
cn.alavu.util.EncodeServlet.process(EncodeServlet.java:13)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
问题就是当我添加类别时,说该类别已经存在,但是数据库里没有这个类别啊,今天上午都可以的,后来不知道动了哪里就不行了,非得把ServiceImpl.java中的if(kdi.get(sess, kindName)!=null) throw new ServiceException("该类别已经存在")这句干掉就可以了,从出现的问题来看kdi.get(sess, kindName)!=null返回的怎么是ture呢?不管你输入的是什么样的类别!搞了一个晚上了,请高手帮忙看下,谢谢!
 

解决方案 »

  1.   

     KindDaoInterf kdi = (KindDaoInterf)DaoFactory.instance().getDao("kindDao");
    这句话是干什么的?
      

  2.   


    package cn.alavu.factory;import java.io.File;
    import java.util.*;
    import org.dom4j.*;
    import org.dom4j.io.SAXReader;
    import cn.alavu.util.*;
    import cn.alavu.dao.base.Dao;public class DaoFactory {
        private Map<String , Dao> daoMap = new HashMap<String , Dao>();
        private static DaoFactory df;
        private DaoFactory() throws Exception
        {
         Document doc = new SAXReader().read(new File(ConstantVariable.realPath + "\\daoContext.xml"));
         Element base = doc.getRootElement();
         List el = base.elements();
         for(Iterator it = el.iterator();it.hasNext();)
         {
         Element em = (Element)it.next();
         String id = em.attributeValue("id");
         String impl = em.attributeValue("class");
         Class implClass = Class.forName(impl);
         Dao d = (Dao)implClass.newInstance();
         daoMap.put(id, d);
         }
        }
        public static DaoFactory instance()throws Exception
        {
         if(df==null)
         {
         df = new DaoFactory();
         }
         return df;
        }
        public Dao getDao(String id)
        {
         return daoMap.get(id);
        }
    }这个应该没有问题的,我把那句话干掉就可以了啊,但是就不能判断数据库里之前是否存在这个种类啊
      

  3.   

    public Kind get(Session sess,String kindName)
        {
            return (Kind)sess.load(Kind.class, kindName);
        }
    你的这个方法中kindName是主键吗?返回的类型为Kind后:判断
    if(kdi.get(sess, kindName)!=null)
       throw new ServiceException("该类别已经存在")
    然后抛出你自己定义的异常对吗?我觉得关键地方还是你的get方法,你可以加断点调试跟踪一下 
    然后有什么问题再贴出来看看……
      

  4.   

    问题解决了吗?我觉得也是KindDaoImpl 类get方法的问题,调试一下看看吧
      

  5.   

    public Kind get(Session sess,String kindName)
        {
            return (Kind)sess.load(Kind.class, kindName);
        }
    有问题.
    session的load()方法会返回一个代理类,所有不管数据库有没有这个记录,他永远返回的都不是一个null对象。
    建议使用get()方法
      

  6.   

    上面错了,是建议使用find()
      

  7.   

    今天比较乱,确定是get()方法。
    hibernate中session.get/load方法都能通过指定实体类名和id从数据库中读取指定的记录,并且返回与之对映的实体对象。但是它们也有很大的区别:(1)当记录不存在时候,get方法返回null,load方法产生异常(2)load方法可以返回实体的代理类,get方法则返回真是的实体类(3)load方法可以充分利用hibernate的内部缓存和二级缓存中的现有数据,而get方法仅仅在内部缓存中进行数据查找,如果没有发现数据則将越过二级缓存,直接调用SQL查询数据库。
     (4) 也许别人把数据库中的数据修改了,load如何在缓存中找到了数据,则不会再访问数据库,
    而get则会返回最新数据。