刚刚开始学习hibernate,结合书上讲的和网上的实力,自己试着写了一个测试hibernate的工程,结果总是报数据表名对象无效的异常,比如我的数据表名称为"t_user",异常就报,对象名‘t_user’无效,
下面是异常信息,请大家帮忙指正一下,谢谢。
Hibernate: select user0_.id as id0_, user0_.name as name0_, user0_.birthday as birthday0_ from t_user user0_ where user0_.id=?
org.hibernate.exception.SQLGrammarException: could not execute query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.loader.Loader.doList(Loader.java:2231)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2125)
at org.hibernate.loader.Loader.list(Loader.java:2120)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:401)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:361)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1148)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
at com.ctrl.UserDAO.findById(UserDAO.java:43)
at com.servlet.TestServlet.doPost(TestServlet.java:81)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 对象名  't_user' 无效。
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(Unknown Source)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(Unknown Source)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1808)
at org.hibernate.loader.Loader.doQuery(Loader.java:697)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
at org.hibernate.loader.Loader.doList(Loader.java:2228)
... 23 more
2009-8-8 23:30:57 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet TestServlet threw exception
java.lang.NullPointerException
at com.servlet.TestServlet.doPost(TestServlet.java:82)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)

解决方案 »

  1.   

    有人知道这个问题吗,我用的服务其实tomcat,数据库是ms sql2005
      

  2.   

    你看看你的hibernate配置文件,看看映射的pojo和表明是不是一致,如果不一致会报表明无效的
    还有,你最好把你生成这个sql语句的代码贴出来,这张会比较好查错
      

  3.   

    下面是hibernate.cfg.xml文件
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
    <session-factory>
    <property name="show_sql">true</property>
    <property name="dialect">org.hibernate.dialect.SQLServerDialect</property>
    <property name="connection.driver_class">
    com.microsoft.sqlserver.jdbc.SQLServerDriver
    </property>
    <property name="connection.url">
    jdbc:sqlserver://WWW-0107C52A0CE:1433;dataName=test
    </property>
    <property name="connection.username">sa</property>
    <property name="connection.password">19830125</property>
    <mapping resource="com/test/User.hbm.xml"/>
    </session-factory>
    </hibernate-configuration>下面是User.hbm.xml
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
          "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
              "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.test">
    <class name="User" table="t_user">
            <id name="id" column="id" type="java.lang.Integer">
                <generator class="identity" />
            </id>
            <property name="name" column="name" type="java.lang.String"/>
            <property name="birthday" column="birthday" type="java.sql.Date"/>
        </class>
    </hibernate-mapping>下面是打印出的sql语句
    select user0_.id as id0_, user0_.name as name0_, user0_.birthday as birthday0_ from t_user user0_ where user0_.id=? 
      

  4.   

    把打印出来的sql放到数据库里执行一下看一下有没有问题,
    如果可以那再看看
    <property name="connection.url">
                jdbc:sqlserver://WWW-0107C52A0CE:1433;dataName=test
            </property>
    有没有连接对
      

  5.   

    感谢楼上的朋友的关注,sql语句,我已经在sql里面执行过,没有错误,连接我也单独测试够,没有问题
      

  6.   

    你把UserDao这个类贴出来看一下,可能会有帮助
      

  7.   

    我的UserDAO类
    package com.ctrl;import java.util.Iterator;
    import java.util.List;
    import org.hibernate.Query;
    import org.hibernate.classic.Session;import com.common.BaseHibernateDAO;
    import com.sun.org.apache.commons.logging.Log;
    import com.sun.org.apache.commons.logging.LogFactory;
    import com.test.User;public class UserDAO extends BaseHibernateDAO implements IUserDAO { private static final Log log = LogFactory.getLog(UserDAO.class);

    public void delete(User persistentInstance) {
    // TODO Auto-generated method stub } public List findAll() {
    // TODO Auto-generated method stub
    return null;
    } public List findByExample(User instance) {
    // TODO Auto-generated method stub
    return null;
    } public User findById(Integer id) {
    // TODO Auto-generated method stub
    Session s = null;
    try
    {
    s = this.getSes();
    s.beginTransaction();
    User user = (User)s.load(User.class, id);
    System.out.println(user.getId());
    System.out.println(user.getName());
    System.out.println(user.getBirthday());
    s.getTransaction().commit();
    System.out.println(user.getId());
    System.out.println(user.getName());
    System.out.println(user.getBirthday());
    return user;
    } catch (Exception e) {
    e.printStackTrace();
    return null;
    }
    } public List findByName(String name) {
    // TODO Auto-generated method stub
    return null;
    } public List findByProperty(String propertyName, Object value) {
    // TODO Auto-generated method stub
    return null;
    } public void save(User transientInstance) {
    // TODO Auto-generated method stub
    log.debug("save User Instance");
    Session session = null;
    try{
    session = this.getSes();
    session.beginTransaction();
    session.save(transientInstance);
    session.getTransaction().commit();
    log.debug("save User Instance Successful");
    } catch (Exception e) {
    log.debug("save User Instance Successful");
    e.printStackTrace();
    }
    }}
    HibernateSeesionFactory类
    /**
     * 
     */
    package com.common;import org.hibernate.cfg.Configuration;
    import org.hibernate.classic.Session;
    import org.hibernate.HibernateException;
    import org.hibernate.SessionFactory;/**
     * @author Administrator
     *
     */
    public class HibernateSessionFactory { private static Configuration config = new Configuration();
    private static final ThreadLocal<Session> localThread = new ThreadLocal<Session>();
    private static SessionFactory sessionFactory;

    // 构建session工厂
    public HibernateSessionFactory()
    {
    config.configure("/hibernate.cfg.xml");
    sessionFactory = config.buildSessionFactory();
    }

    // 获取session
    public Session getSe() throws HibernateException
    {
    Session session = (Session)localThread.get();
    if(session==null || !session.isOpen())
    {
    session = (sessionFactory != null)?sessionFactory.openSession():rebulidSessionFactory().openSession();
    localThread.set(session);
    }
    return session;
    }

    // 重建session工厂
    private SessionFactory rebulidSessionFactory()
    {
    config = config.configure("/hibernate.cfg.xml");
    sessionFactory = config.buildSessionFactory();
    return sessionFactory;
    }
    }
      

  8.   

    jar包用的是什么!要用最新的
      

  9.   

    还有,你的User又实现serializable接口吗?
      

  10.   

    java.lang.NullPointerException  ?
      

  11.   

    我的User类实现了serializable接口
      

  12.   

     public User findById(Integer id) {
            // TODO Auto-generated method stub
            Session s = null;
            try
            {
                s = this.getSes();
                s.beginTransaction();
                User user = (User)s.load(User.class, id);
                System.out.println(user.getId());
                System.out.println(user.getName());
                System.out.println(user.getBirthday());
                s.getTransaction().commit();
                System.out.println(user.getId());
                System.out.println(user.getName());
                System.out.println(user.getBirthday());
                return user;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
    红色的一句是报错的,因为根本就没有查出user数据,所以user的name变量是null
    没有查出的原因就是报数据表名“t_user”对象无效
      

  13.   


    我是在官方网站下载的最新的jar包
      

  14.   

    嘿嘿。这个问题我也遇到过。。
    二楼的回答是正解。
    你看看数据库用对了吗?
    像我是的。以为数据库出错了。重装的数据库都不好使
    后来才发现是用错了
    create database demo
    忘了use demo
    结果是用的默认的Master...
    这样就会出现列名无效。。
      

  15.   


    把你的工程目录结构贴出来,还有你的sessionFactory.class是自动创建的还是手动写的?
      

  16.   


    我的数据表是自己手动创建的,不是用的sql创建,连接数据库的配置文件也有dataName=test啊我的工程目录结构中hibernate.cfg.xml文件就在src目录下,User.hbm.xml和UserDAO类在同一个包目录下,session工厂类是我自己写的,但是和myeclipse自动生成的是一样的,我看过config的配置文件路径,也没有错误