项目还有几天的时间要交了,但还存在很多问题,希望大家帮助我解决。谢谢。
项目简介:用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();
}
}
}
项目简介:用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();
}
}
}
你检查你的项目中包含 Admin.java
配置的问题.. 注意配置文件中classpath(环境的路径)
同时修改了hibernate.reveng.xml 和 admin.hbm.xml中的class路径,将class="Admin"改为class="first.Admin".
按理来说实体不可能是未知啊!!!
第二个问题是你在使用log4j时,没有添加log4j的资源文件。
这个是刚构建反向工程时就有的。
得到这个资源文件后,具体怎样配置才能让日志显示,请高手指导。谢谢。
Include referenced tables A->B , Include referencing tables A<-B
你说的实体类相关联是指这个吗? 其他的hbm.xml名字经检查无误。
如果哪位高手需要查看什么文件,告诉我,我第一时间上传。谢谢各位了。
log4j是一个开源的日志工具包,可以采用xml和properties两种配置方式
由于你的项目构建路径中存在log4j.jar 但实际上并没有用到,所以控制台会有警告
这不会影响你的项目运行
在你需要记录日志的时候 可以在你的类中初始化Logger类 并配置properties文件 就不会有这个警告了
第二个问题应该如楼上回答 是配置路径的问题 建议你把配置文件中改为绝对路径试试
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.
<mapping resource ="这个地址,包名这些写对没有嘛">
Admin.hbm.xml中
<hibernate-mapping>
<class name="在这个地址下有没有Admin.java?" table="ADMIN" >
AdminDAO.java文件贴出来。
昨晚上看了个视频教程,里面将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;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;
}
}
昨天晚上就睡了一个小时一直到早晨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;
}
}
}
高手赐教。谢谢。
我仔细阅读了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);
谢谢各位给我精神上的支持,这几天真的太难熬了,谢谢。
<property name="current_session_context_class">thread</property>
我想对这些细节的更新综合起来,才会解决异常的吧。
在用myeclipse的hibernate向导生成dao时,会自定义一个SessionFactory,该SessionFactory使用ThreadLocal来保证
其线程安全。