在使用hibernate做java project时,出现异常,如下:org.hibernate.exception.SQLGrammarException: could not insert: [com.ldxy.Student]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:64)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2176)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2656)
at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:321)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:563)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:551)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:547)
at com.ldxy.StudentDAO.save(StudentDAO.java:24)
at com.ldxy.StudentDAO.main(StudentDAO.java:44)
Caused by: com.mysql.jdbc.exceptions.jdbc4.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 'add) values ('gouyikui', 20, '15294471291', 'qingyang')' at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.Util.getInstance(Util.java:386)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3597)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3529)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1990)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2151)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2625)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2119)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2415)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2333)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2318)
at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:94)
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:57)
... 17 morejava源码如下:package com.ldxy;import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;public class StudentDAO
{
public void save()
{
Configuration config = new Configuration().configure();

SessionFactory sf = config.buildSessionFactory();

Session session = sf.openSession();

Transaction t = session.beginTransaction();

Student student = new Student("gouyikui", 20, "15294471291", "qingyang");

try
{
session.save(student);
t.commit();
} catch(Exception e)
{
t.rollback();
e.printStackTrace();
} finally
{
session.close();
}
}

public void findAll()
{

}

public static void main(String[] args)
{
StudentDAO studentDAO = new StudentDAO();
studentDAO.save();
}
}
求解,在线等~~~

解决方案 »

  1.   

    Student表的结构和约束都是什么!
      

  2.   

    提示说你的SQL语句有错。。楼主,把你的Student映射文件贴出来看一下(如果用注解,把Student代码贴出来)你把代码格式化一下,发贴那里有个代码格式化的可以插入Java代码
      

  3.   

    怎么会生成这样的sql
    add) values ('gouyikui', 20, '15294471291', 'qingyang')
    你 的字段名叫add? 这个是mysql的保留字 换个字段名
      

  4.   


    表结构如下:
    +---------+-------------+------+-----+---------+-------+
    | Field   | Type        | Null | Key | Default | Extra |
    +---------+-------------+------+-----+---------+-------+
    | id      | int(11)     | NO   | PRI | NULL    |       |
    | name    | varchar(20) | YES  |     | NULL    |       |
    | age     | int(11)     | YES  |     | NULL    |       |
    | add     | varchar(20) | YES  |     | NULL    |       |
    +---------+-------------+------+-----+---------+-------+
      

  5.   

    Student代码如下:
    package com.ldxy;public class Student implements java.io.Serializable { private Integer id;
    private String name;
    private Integer age;
    private String add; // Constructors /** default constructor */
    public Student() {
    } /** full constructor */
    public Student(String name, Integer age, String add) {
    this.name = name;
    this.age = age;
    this.add = add;
    } // Property accessors public Integer getId() {
    return this.id;
    } public void setId(Integer id) {
    this.id = id;
    } public String getName() {
    return this.name;
    } public void setName(String name) {
    this.name = name;
    } public Integer getAge() {
    return this.age;
    } public void setAge(Integer age) {
    this.age = age;
    } public String getAdd() {
    return this.add;
    } public void setAdd(String add) {
    this.add = add;
    }}其映射文件如下:<?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- 
        Mapping file autogenerated by MyEclipse Persistence Tools
    -->
    <hibernate-mapping>
        <class name="com.ldxy.Student" table="student" catalog="hibernate">
            <id name="id" type="java.lang.Integer">
                <column name="id" />
                <generator class="native"></generator>
            </id>
            <property name="name" type="java.lang.String">
                <column name="name" length="20" />
            </property>
            <property name="age" type="java.lang.Integer">
                <column name="age" />
            </property>
            <property name="address" type="java.lang.String">
                <column name="address" length="20" />
            </property>
        </class>
    </hibernate-mapping>
      

  6.   


    hibernate配置文件如下:<?xml version='1.0' encoding='UTF-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC
              "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
              "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><!-- Generated by MyEclipse Hibernate Tools.                   -->
    <hibernate-configuration> <session-factory>
    <property name="dialect">
    org.hibernate.dialect.MySQLDialect
    </property>
    <property name="connection.url">
    jdbc:mysql://localhost:3306
    </property>
    <property name="connection.username">root</property>
    <property name="connection.password">19910309gw</property>
    <property name="connection.driver_class">
    com.mysql.jdbc.Driver
    </property>
    <property name="myeclipse.connection.profile">
    mysqlCon
    </property>
    <mapping resource="com/ldxy/Student.hbm.xml" /> </session-factory></hibernate-configuration>
      

  7.   

    你 的字段名叫add? add是mysql的保留字 换个字段名
      

  8.   


    后来我将add换成address了, 但还是那个错误提示。应该不是add字段的问题。
      

  9.   

    字段改了 hibernate的PO和配置文件也要改
      

  10.   

    配置文件还得加上mysql的数据库名吧。。
      

  11.   

    楼主你看看你的表结构,就四个字段 id name age add类型id 和 age 是 int为什么插入语句是:values("gouyikui", 20, "15294471291", "qingyang");不知道楼主的插入顺序是怎样的,但起码不是三个字符串吧!
      

  12.   


    /** full constructor */
    public Student(String name, Integer age, String add) {
    this.name = name;
    this.age = age;
    this.add = add;
    }这样的构造函数能这样new?
    Student student = new Student("gouyikui", 20, "15294471291", "qingyang");
    还有你
    <id name="id" type="java.lang.Integer">
      <column name="id" />
      <generator class="native"></generator>
      </id>
    id是Integer 可以存字符串?
      

  13.   

    <property name="connection.url">jdbc:mysql://localhost:3306</property>在3306后面加上你的数据库名称
      

  14.   

    使用hibernate框架,可以自动建表,但要自己手动创建数据库...
      

  15.   

    谢谢大家,我已经找到问题了,原来id的生成策略要改成increment,native不行,identity也不行。但是大家能告诉我这是为什么啊?