java - Hibernate 注释错误(org.hibernate.exception.SQLGrammarException : could not insert: [com. hib.ex.entity.Node])

标签 java hibernate hibernate-annotations

我是 Hibernate Annotation 的初学者,我想实现一个示例,但它给了我以下错误消息:

****************WRITING****************
log4j:WARN No appenders could be found for logger (org.hibernate.type.BasicTypeRegistry).
log4j:WARN Please initialize the log4j system properly.
Hibernate: insert into Node (group, name) values (?, ?)
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not insert: [com.hib.ex.entity.Node]
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92)
    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:2345)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2852)
    at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71)
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273)
    at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:320)
    at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203)
    at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129)
    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:713)
    at org.hibernate.impl.SessionImpl.save(SessionImpl.java:701)
    at org.hibernate.impl.SessionImpl.save(SessionImpl.java:697)
    at com.hib.ex.dao.HibExDao.saveNode(HibExDao.java:19)
    at com.hib.ex.main.Run.main(Run.java:18)
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 'group, name) values (null, 'zakaria')' at line 1
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
    at com.mysql.jdbc.Util.getInstance(Util.java:381)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3558)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3490)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2109)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2643)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2077)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2362)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2280)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2265)
    at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:94)
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:57)
    ... 17 more

这是实体类Node:

package com.hib.ex.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="Node")
public class Node {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer id;

    @Column
    private String name;

    @Column
    private Integer group;

    public Node() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Node(Integer id, String name, Integer group) {
        super();
        this.id = id;
        this.name = name;
        this.group = group;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getGroup() {
        return group;
    }

    public void setGroup(Integer group) {
        this.group = group;
    }

}

这是 DAO 类 HibExDao:

package com.hib.ex.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import com.hib.ex.entity.HyperEdge;
import com.hib.ex.entity.Node;

public class HibExDao {

    public void saveNode(Node noeud) {

        SessionFactory sf = HibExUtil.getSessionFactory();
        Session session = sf.openSession();
        session.beginTransaction();

        session.save(noeud);

        session.getTransaction().commit();
        session.close();

    }

    public List listNode() {

        SessionFactory sf = HibExUtil.getSessionFactory();
        Session session = sf.openSession();

        List nodes = session.createQuery("FROM Node").list();
        session.close();
        return nodes;

    }

    public Node readNode(Integer id) {

        SessionFactory sf = HibExUtil.getSessionFactory();
        Session session = sf.openSession();

        Node noeud = (Node) session.get(Node.class, id);
        session.close();
        return noeud;

    }

}

这是 hibernate.cfg.xml 文件:

<?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">

<hibernate-configuration>

    <session-factory>
        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/exhiber</property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>

        <property name="connection.pool_size">1</property>
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="current_session_context_class">thread</property>
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
        <property name="show_sql">true</property>
        <property name="hbm2ddl.auto">update</property>


        <mapping class="com.hib.ex.entity.Node" />
        <mapping class="com.hib.ex.entity.HyperEdge" />

    </session-factory>

</hibernate-configuration>

这是执行类Run:

package com.hib.ex.main;

import java.util.List;

import com.hib.ex.dao.HibExDao;
import com.hib.ex.entity.Node;

public class Run {


    public static void main(String[] args) {

        HibExDao dao = new HibExDao();

        System.out.println("****************WRITING****************");
        Node n1 = new Node();
        n1.setName("zakaria");
        dao.saveNode(n1);
        System.out.println("Node saved!");
        Node n2 = new Node();
        n2.setName("anas");
        dao.saveNode(n2);
        System.out.println("Node saved!");

        System.out.println("\n****************READING****************");
        List nodes = dao.listNode();
        System.out.println("Name in Node number 2 is: " + dao.readNode(2).getName());

    }

}

有什么问题吗?我能解决这个问题吗?

谢谢!

最佳答案

原因已明确提及:

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 'group, name) values (null, 'zakaria')' at line 1

您的实体包含导致此问题的属性:

@Column
private Integer group;

答案很简单group是一个保留的SQL关键字(参见GROUP BY子句`)

要解决此问题,您需要重命名为列名称并将其正确映射到您的实体属性。

此外,您没有填充 group 字段,因此它是 NULL。也许 MySQL 不接受此列的 NULL

我希望这会有所帮助。

<小时/>

如果您想使用保留关键字,可以使用以下规范来实现:

在 JPA 2.0 中:

@Column(name="\"group\"")

在 hibernate 状态下:

@Column(name="'group'")

关于java - Hibernate 注释错误(org.hibernate.exception.SQLGrammarException : could not insert: [com. hib.ex.entity.Node]),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24600835/

相关文章:

java - Spring Boot 中使用 3 个表进行 Hibernate 映射的问题

java - 如何将 MultipartFile 转换为所需类型 byte[]

hibernate - 当我提交事务时,完整性约束被违反

java - 无法从 AndroidManifest.xml 读取 packageName

java - JFrame 窗口拒绝打开

Java 2D 数组列表

java - Java中出现Socket read timed out Exception的原因是什么?

java - spring-boot应用程序中 Autowiring 组件时如何解决NullPointerException

Hibernate:OneToMany 通过级联拯救 child

java - 具有基于注释的复合主键的 Hibernate createCriteria 查询