项目还有几天的时间要交了,但还存在很多问题,希望大家帮助我解决。谢谢。
项目简介:用struts+hibernate构建一个网上商店后台管理,IDE为myeclipse 6 ,tomcat 5.5 ,mysql
项目实现:在登录页面的处理中,用到login.jsp+loginForm+loginAction,数据库方面的持久类为Admin+AdminDAO.我将连接数据库并判断登录是否正确代码用CheckAdmin类来封装。
项目困难:1,每当运行login.jsp时老是提示以下异常。我查看了hibernate.cfg.xml admin.hbm.xml hibernate.reveng.xml 觉得配置没错
          javax.servlet.ServletException: Unknown entity: Admin  
         org.hibernate.MappingException: Unknown entity: Admin          2,刚才console中居然没有了项目运行时的提示,出现一下语句,应该是log4j.properties没有找到,第一次听说这个文件,以前项目console提示很正常呀,就是突然这样了。
log4j:WARN No appenders could be found for logger (org.apache.commons.digester.Digester.sax).
log4j:WARN Please initialize the log4j system properly.现在,把我的checkAdmin和loginAction  代码贴上,其他类的代码和大多数项目一样。项目真的很急,希望各位高手帮忙啦。谢谢。public class CheckAdmin { public AdminDAO dao = null;
public boolean checkId(String login_id){
boolean haveId =false;
dao = new AdminDAO();
Admin  adminMoment=null;
adminMoment= dao.findById(login_id);
if(adminMoment!=null){
haveId=true;
}

return haveId;  
}
public boolean checkPassword(String login_id, String login_password){
boolean passwordRight =false;
dao = new AdminDAO();
Admin adminMoment =null;
adminMoment= dao.findById(login_id);
if(adminMoment.getLogPassword().equals(login_password)){
passwordRight=true;
}
return passwordRight;
}

}public class LoginAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {

                LoginForm loginForm = (LoginForm) form;
                CheckAdmin ck =new CheckAdmin();

if(ck.checkId(loginForm.getLogin_id())){
if(ck.checkPassword(loginForm.getLogin_id(), loginForm.getLogin_password())){

AfterRightCheck.saveInSession(request, loginForm.getLogin_id());
return mapping.findForward("index");
}
else {
Message msg = new Message();
msg.sendMessage("login.action.login_password");
saveMessages(request, msg.messages);
return mapping.getInputForward();

}

}
else {
Message msg = new Message();
msg.sendMessage("login.action.login_id");
saveMessages(request, msg.messages);
return mapping.getInputForward();

}
}
}

解决方案 »

  1.   

    未知的实体 Admin 
    你检查你的项目中包含 Admin.java
    配置的问题.. 注意配置文件中classpath(环境的路径)
      

  2.   

    在用 hibernate构建反向工程的时候,Admin.java 和AdminDAO.java是在src下的默认包中,我新建了个first包,并将这两个类放了进去。
    同时修改了hibernate.reveng.xml 和 admin.hbm.xml中的class路径,将class="Admin"改为class="first.Admin".
    按理来说实体不可能是未知啊!!!
      

  3.   

    第一个问题应该是实体bean的问题,使用配置文件的方式没有使用过,但是这个地方是由于实体bean的问题是肯定的。
    第二个问题是你在使用log4j时,没有添加log4j的资源文件。
      

  4.   

    仔细检查hibernate.cfg.xml配置文件,其中存在配置实体类错误。一般是类名写错了,不要相信自动生成的代码就是正确的。
      

  5.   

    回 bdql,hibernate.cfg.xml中没有实体类的配置,只有<mapping resource ="./Admin.hbm.xml">.
    这个是刚构建反向工程时就有的。
      

  6.   

    哪位能先给我传个log4j.properties文件。我重装了tomcat,还是无法再console中显示日志消息。
    得到这个资源文件后,具体怎样配置才能让日志显示,请高手指导。谢谢。
      

  7.   

    Admin实体有没有和其它的实体相关联?有可能是其它的hbm.xml文件中没有改完类名。
      

  8.   

    回复 bdql,表admin构建反向工程的最后一页的配置中,就是需要手动输入类名Admin的那一页,我选中了两个选择框
    Include referenced  tables A->B ,         Include   referencing  tables A<-B   
    你说的实体类相关联是指这个吗? 其他的hbm.xml名字经检查无误。
    如果哪位高手需要查看什么文件,告诉我,我第一时间上传。谢谢各位了。
      

  9.   

    将工程clean之后,重新deploy,然后start服务器,请求login.jsp,将控制台的输出信息拷贝出来看下。
      

  10.   

    第二个问题给你解答一下:
    log4j是一个开源的日志工具包,可以采用xml和properties两种配置方式
    由于你的项目构建路径中存在log4j.jar 但实际上并没有用到,所以控制台会有警告
    这不会影响你的项目运行
    在你需要记录日志的时候 可以在你的类中初始化Logger类 并配置properties文件  就不会有这个警告了
    第二个问题应该如楼上回答 是配置路径的问题 建议你把配置文件中改为绝对路径试试
      

  11.   

    重新发布项目后,console中没有关于项目问题的提示,页面提示如下。刚看了一个浪溪的struts+hibernate登录例子录像,最后居然是个半成品,项目居然没成功,这样也发布,郁闷啊。谢谢各位了,我会一直加班到凌晨的。
    HTTP Status 500 - --------------------------------------------------------------------------------type Exception reportmessage description The server encountered an internal error () that prevented it from fulfilling this request.exception javax.servlet.ServletException: Unknown entity: Admin
    org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:535)
    org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:433)
    org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
    org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
    org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    root cause org.hibernate.MappingException: Unknown entity: Admin
    org.hibernate.impl.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:514)
    org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:66)
    org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:862)
    org.hibernate.impl.SessionImpl.get(SessionImpl.java:799)
    first.AdminDAO.findById(AdminDAO.java:54)
    first.CheckAdmin.checkId(CheckAdmin.java:12)
    com.yourcompany.struts.action.LoginAction.execute(LoginAction.java:31)
    org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
    org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
    org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
    org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    note The full stack trace of the root cause is available in the Apache Tomcat/5.5.25 logs.
      

  12.   

    你把hibernate.cfg.xml和Admin.java代码完整复制出来``或者用反向生成工具重新生成试一下嘛……
    <mapping resource ="这个地址,包名这些写对没有嘛">
    Admin.hbm.xml中
    <hibernate-mapping>
        <class name="在这个地址下有没有Admin.java?" table="ADMIN" >
      

  13.   

    SessionFactory在加载hbm.xml文件时发现没有有不认识的实体。
    AdminDAO.java文件贴出来。
      

  14.   

    本来hibernate.cfg.xml和Admin.hbm.xml都在Src下,Admin.java和AdminDAO.java都在com.davie.vo下。
    昨晚上看了个视频教程,里面将Admin.hbm.xml与持久化类放在了一起,于是我将它放了进去。同时修改了各个参
    数,但错误还是那样。
    我想既然让前台和后台发生联系那么难,就先测试一下后台能用否,于是打开了HQL Editor,输入"from Admin ",本应该出来查询结果的,可是却出现了一句Session factory not created for configuration。我目前的策略是不用hibernate自动生成的HibernateSessionFactory.java的getsession(),而是自己写。我想问题出在SessionFactory上。下面贴出所有。1.   Hibernate.cfg.xml<hibernate-configuration> <session-factory>
    <property name="connection.username">root</property>
    <property name="connection.url">
    jdbc:mysql://localhost:3306/mydb?useUnicode=true&amp;amp;characterEncoding=8859_1
    </property>
    <property name="dialect">
    org.hibernate.dialect.MySQLDialect
    </property>
    <property name="myeclipse.connection.profile">mysql5</property>
    <property name="connection.driver_class">
    com.mysql.jdbc.Driver
    </property>
    <mapping resource="com/davie/vo/Admin.hbm.xml" />
    <mapping resource="com/davie/vo/User.hbm.xml" />
    </session-factory>
    </hibernate-configuration>2.     Admin.hbm.xml<hibernate-mapping>
        <class name="com.davie.vo.Admin" table="admin" catalog="mydb">
            <id name="logId" type="java.lang.String">
                <column name="log_id" length="20" />
                <generator class="assigned"></generator>
            </id>
            <property name="logPassword" type="java.lang.String">
                <column name="log_password" length="20" not-null="true" />
            </property>
        </class>
    </hibernate-mapping>3.    Admin.javapackage com.davie.vo;@SuppressWarnings("serial")
    public class Admin  implements java.io.Serializable {

         private String logId;
         private String logPassword;
         
        public Admin() {
        }    public Admin(String logId, String logPassword) {
            this.logId = logId;
            this.logPassword = logPassword;
        }    public String getLogId() {
            return this.logId;
        }
        
        public void setLogId(String logId) {
            this.logId = logId;
        }    public String getLogPassword() {
            return this.logPassword;
        }
        
        public void setLogPassword(String logPassword) {
            this.logPassword = logPassword;
        }
      
    }
      

  15.   

    AdminDAO.java是自动生成的,个人认为贴出来作用不大。但应朋友们提议,还是贴出来吧。
    昨天晚上就睡了一个小时一直到早晨6点,实在是太郁闷了,一个实体类错误居然浪费了我这么久。很困惑。谢谢各位了。4.    AdminDAO.javapackage com.davie.vo;import java.util.List;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.hibernate.LockMode;
    import org.hibernate.Query;
    import org.hibernate.criterion.Example;public class AdminDAO extends BaseHibernateDAO  {
        private static final Log log = LogFactory.getLog(AdminDAO.class);

    public static final String LOG_PASSWORD = "logPassword";    public void save(Admin transientInstance) {
            log.debug("saving Admin instance");
            try {
                getSession().save(transientInstance);
                log.debug("save successful");
            } catch (RuntimeException re) {
                log.error("save failed", re);
                throw re;
            }
        }
        
    public void delete(Admin persistentInstance) {
            log.debug("deleting Admin instance");
            try {
                getSession().delete(persistentInstance);
                log.debug("delete successful");
            } catch (RuntimeException re) {
                log.error("delete failed", re);
                throw re;
            }
        }
        
        public Admin findById( java.lang.String id) {
            log.debug("getting Admin instance with id: " + id);
            try {
                Admin instance = (Admin) getSession()
                        .get("Admin", id);
                return instance;
            } catch (RuntimeException re) {
                log.error("get failed", re);
                throw re;
            }
        }
        
        
        @SuppressWarnings("unchecked")
    public List findByExample(Admin instance) {
            log.debug("finding Admin instance by example");
            try {
                List results = getSession()
                        .createCriteria("Admin")
                        .add(Example.create(instance))
                .list();
                log.debug("find by example successful, result size: " + results.size());
                return results;
            } catch (RuntimeException re) {
                log.error("find by example failed", re);
                throw re;
            }
        }    
        
        @SuppressWarnings("unchecked")
    public List findByProperty(String propertyName, Object value) {
          log.debug("finding Admin instance with property: " + propertyName
                + ", value: " + value);
          try {
             String queryString = "from Admin as model where model." 
              + propertyName + "= ?";
             Query queryObject = getSession().createQuery(queryString);
     queryObject.setParameter(0, value);
     return queryObject.list();
          } catch (RuntimeException re) {
             log.error("find by property name failed", re);
             throw re;
          }
    } @SuppressWarnings("unchecked")
    public List findByLogPassword(Object logPassword
    ) {
    return findByProperty(LOG_PASSWORD, logPassword
    );
    }
    @SuppressWarnings("unchecked")
    public List findAll() {
    log.debug("finding all Admin instances");
    try {
    String queryString = "from Admin";
             Query queryObject = getSession().createQuery(queryString);
     return queryObject.list();
    } catch (RuntimeException re) {
    log.error("find all failed", re);
    throw re;
    }
    }

        public Admin merge(Admin detachedInstance) {
            log.debug("merging Admin instance");
            try {
                Admin result = (Admin) getSession()
                        .merge(detachedInstance);
                log.debug("merge successful");
                return result;
            } catch (RuntimeException re) {
                log.error("merge failed", re);
                throw re;
            }
        }    public void attachDirty(Admin instance) {
            log.debug("attaching dirty Admin instance");
            try {
                getSession().saveOrUpdate(instance);
                log.debug("attach successful");
            } catch (RuntimeException re) {
                log.error("attach failed", re);
                throw re;
            }
        }
        
        public void attachClean(Admin instance) {
            log.debug("attaching clean Admin instance");
            try {
                getSession().lock(instance, LockMode.NONE);
                log.debug("attach successful");
            } catch (RuntimeException re) {
                log.error("attach failed", re);
                throw re;
            }
        }
    }
      

  16.   

    HQL 编辑器提示需要加载Jdk1.6,可我在配置服务器tomcat 时已经设置了JDK为1.6了,为什么会显示我用的是1.5呢。
    高手赐教。谢谢。
      

  17.   

    问题终于解决了,谢谢各位。
    我仔细阅读了Hibernate自动生成HtttpsessionFactory.java和IBaseHibernateDAO.java以及IBaseHibernateDAO.java的源代码,
    发现它有两个地方不太好,于是自己写了个AboutSession.java 类,用于创建Session.
    两个我觉得有问题的地方分别是:
    1,网上说SessionFactory的实例对象 sf,取得Session时应用sf.openSession();而不是sf.getCurrentSession();
    或者sf.getSession();
    2,Session的实例对象 session取得Admin时应用session.get(Admin.class,login_id);而不是Hibernate自动生成时的 
    session.get("Admin",login_id);
    谢谢各位给我精神上的支持,这几天真的太难熬了,谢谢。
      

  18.   

    对了,还有就是Hibernate 使用xml格式的配置文件时,要在Hibernate.cfg.xml中写上一句,
    <property name="current_session_context_class">thread</property>
    我想对这些细节的更新综合起来,才会解决异常的吧。
      

  19.   

    session对象是非线程安全的,所以在使用时要应保证其线程安全性。
    在用myeclipse的hibernate向导生成dao时,会自定义一个SessionFactory,该SessionFactory使用ThreadLocal来保证
    其线程安全。