首先谢谢你能看我的帖子 麻烦各位浪费一些宝贵时间帮我看看 谢谢了 小弟搞了好久了 这个问题困扰我很久也没有解决所以万不得已来这里请教高人了 接下来我来叙述一下我的问题吧首先我使用的是MYSQL数据库 然后我在这个数据库中建立了一个USER表 其中有一个外键(INT类型) 指向了一个 身份证类型的表简单说就是外键表 接着我使用SPRING对HIBERNATE进行管理 还有就是使用HIBERNATE自动生成了 USER表和身份证类型这两张表 生成的.hbm.xml文件内容分别如下 
USER.hbm.xml
<hibernate-mapping>
    <class name="com.forum.pojo.User" table="user" catalog="forum">
        <id name="id" type="java.lang.Integer">
            <column name="Id" />
            <generator class="native" />
        </id>
       
        <many-to-one name="card" class="com.forum.pojo.Card" fetch="select">
            <column name="ucard" />
        </many-to-one>===================(这个就是外键表 身份证类型那个表)
        <property name="username" type="java.lang.String">
            <column name="username" length="20" />
        </property>
        <property name="password" type="java.lang.String">
            <column name="password" length="20" />
        </property>
        <property name="tusername" type="java.lang.String">
            <column name="tusername" length="10" />
        </property>
        <property name="qq" type="java.lang.String">
            <column name="qq" length="10" />
        </property>
        <property name="email" type="java.lang.String">
            <column name="email" length="20" />
        </property>
        <property name="call" type="java.lang.String">
            <column name="call" length="10" />
        </property>
        <property name="cardnumber" type="java.lang.String">
            <column name="cardnumber" length="20" />
        </property>
        <property name="integral" type="java.lang.Integer">
            <column name="Integral" />
        </property>
    </class>
</hibernate-mapping> 
接下来是身份证类型这个表的.hbm.xml配置文件
<hibernate-mapping>
    <class name="com.forum.pojo.Card" table="card" catalog="forum">
        <id name="id" type="java.lang.Integer">
            <column name="Id" />
            <generator class="native" />
        </id>
        <property name="cardtype" type="java.lang.String">
            <column name="cardtype" length="10" />
        </property>
        <set name="users" inverse="true">
            <key>
                <column name="ucard" />
            </key>
            <one-to-many class="com.forum.pojo.User" />
        </set>
    </class>
</hibernate-mapping>最后我使用了this.getHibernateTemplate().save(user);来完成添加现在我在写一个TEST测试类 来测试看能不能插入 下面就是测试类ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
IUserDao dao = (IUserDao)context.getBean("UserDao");
User user = new User();
Card c = new Card();---身份类型表 c.setCardtype("身份证");
user.setCard(c);

user.setUsername("Alex_SuTao");
user.setPassword("123456");
user.setEmail("[email protected]");
user.setCardnumber("610404198708210511");
user.setTusername("sutao");
user.setQq("357382027");
user.setIntegral(1000);
user.setCall("15877346240");

dao.save(user);
运行测试类结果就报错如下  Exception in thread "main" org.springframework.dao.InvalidDataAccessResourceUsageException: could not insert: [com.forum.pojo.User]; nested exception is org.hibernate.exception.SQLGrammarException: could not insert: [com.forum.pojo.User]
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:615)
at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:424)
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
at org.springframework.orm.hibernate3.HibernateTemplate.save(HibernateTemplate.java:690)
at com.forum.user.dao.IDao.IUserDao.save(IUserDao.java:28)
at com.forum.test.Test.main(Test.java:41)
Caused by: org.hibernate.exception.SQLGrammarException: could not insert: [com.forum.pojo.User]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:40)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2163)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2643)
at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:51)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:298)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:107)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
at org.springframework.orm.hibernate3.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:693)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
... 4 more
Caused by: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'call, cardnumber, Integral) values (null, null, 'Alex_SuTao', '123456', 'sutao',' at line 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2822)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1536)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1626)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3031)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:943)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1184)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1101)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1086)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:102)
at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:73)
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:33)
... 21 more麻烦各位浪费一些宝贵时间帮我看看 谢谢了 小弟搞了好久了

解决方案 »

  1.   


    你在dao.save(user); 前面加上user.setUcard(c); c.getUsers().add(user);
      

  2.   

    http://topic.csdn.net/u/20090122/13/2f010b0d-2396-4045-82d9-73cfa29cf89d.html
    不知道对你有帮助没
      

  3.   

    你的主键类型是:native(交给数据库管理)。  你MYSQL那边主键怎么设的?自增还是什么? 
      

  4.   


    你在dao.save(user); 前面加上user.setUcard(c); c.getUsers().add(user);
      

  5.   

    你的表名是不是有问题? 我不常用MYSQL,不知道你的表名:user 是不是MYSQL的关键字....  还有catalog="forum"是库名吗?MYSQL有没有默认库呢?
      

  6.   

    com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'call, cardnumber, Integral) values (null, null, 'Alex_SuTao', '123456', 'sutao',' at line 1 
      

  7.   

    com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'call, cardnumber, Integral) values (null, null, 'Alex_SuTao', '123456', 'sutao',' at line 1 
      

  8.   

    我就不信了 这个问题 CSDN 解决不了? 我今天就抱着学习求知的 信念 这帖子一天没答案 我就把他顶到 谷歌第一名!!!!!!
      

  9.   

    用DEBUG追踪一下 看看你的测试类里走到哪一步的时候抛的异常.如果是在测试类里抛出的异常你就好好检查一下你Insert的数据类型是否有问题. 那个异常貌似说的是数据初始化
      

  10.   

    异常说是 SQL语句问题 但是很明显我写的就是HIBERNATE直接就插入了 那里来的SQL语句 郁闷的
      

  11.   

     near 'call, cardnumber, Integral) values (null, null, 'Alex_SuTao', '123456', 'sutao',' at line 1此处 还有User表
      

  12.   

    一共2个异常.. 晕.我只看了一下上边的. 下边那个异常是说SQL语法有问题.你好好看一下你添加一对多那个对象是否正确.
    还有: values (null, null, 'Alex_SuTao', '123456', 'sutao',' at line 1      怎么会有2个null,你设了2列自增吗?
      

  13.   

    <id name="id" type="java.lang.Integer"> 
      <column name="Id" /> 
      <generator class="identity" /> 
    </id> 把所有hibernate映射文件的主键生成策略都改成identity试试
      

  14.   

    你确认mysql中建立了自增长的主键了?
      

  15.   

    也许是hibernate把主键生成策略交给了数据库,而忘记在数据库中建立自增长列了!
      

  16.   

    call字段里设了length=10,可你插入的超过10个字符。
      

  17.   

    你既然将关联处理丢给了多的一端,User表中的ucard参照的是身份证类型这个表的主键,
    身份证类型这个表还没保存产生ID,你User表引用肯定为空1  <id name="id" type="java.lang.Integer"> 
      <column name="Id" /> 
      <generator class="identity" /> 
    </id> 
    2
    先保存身份证类型这个表
      

  18.   

    哎~~~~  对你相当的无语 算了 你说我 不感谢你 我现在谢谢你了 让我明白了很多事情呢 看来问错地方了 问题解决了 CSDN现在都是没工作过的在混?
      

  19.   

    来回复一下 之前是我太着急了 不好意思 还是真诚的感谢 回复帖子的人了 问题在这里说一下 一遍将来人的碰到这个问题看到这个帖子 也能解决  错误原因是 我在MYSQL中创建了一个字段 名为CALL 是MYSQL的关键字 存储过程中会用到的 所以改成了TEL 就好了 。
      

  20.   

    今天正好遇到,我也是错用了mysql的关键字,顶一下,谢谢版主了!