【问题标题】:generation type identity gives error that id(primary key ) doesn't have default value生成类型标识给出 id(primary key) 没有默认值的错误
【发布时间】:2016-04-16 21:03:51
【问题描述】:

我正在尝试使用 identity Generator class 并出现错误,因为我正在使用 MySQL 并使用其他生成器类型代码工作正常,但是当涉及到生成类型“身份”时,它给出了我的错误是 id (在电影类中)没有默认值我尝试了所有可能的解决方案,然后我可以找到但失败了。 请检查我的代码

POJO 类

public class Movie {

    private int id;
    private String title;
    private String synopsis;
    private String director;

    public Movie(String title, String synopsis, String direcotr) {
        this.title = title;
        this.synopsis = synopsis;
        this.director = direcotr;

    }

    public Movie() {
    }

    public int getId() {
        return id;
    }

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

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getSynopsis() {
        return synopsis;
    }

    public void setSynopsis(String synopsis) {
        this.synopsis = synopsis;
    }

    public String getDirector() {
        return director;
    }

    public void setDirector(String director) {
        this.director = director;
    }

}

保存数据

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.exception.GenericJDBCException;

import com.java.commons.HibernateUtil;
import com.java.commons.Movie;

public class SavingData {

    public static void saveData() {
        Session session = null;
        try {
            SessionFactory sessionFactory = HibernateUtil.buldSessionFactory();
            session = sessionFactory.openSession();
            Transaction transaction = session.beginTransaction();
            System.out.println("openSession()");
            System.out.println("session created");
            Movie movie = new Movie("test", "test", "test");
            session.persist(movie);
            transaction.commit();
            session.close();
            System.out.println("data saved with id : " + movie.getId());
        } catch (GenericJDBCException e) {
            System.out.println("error=======> " + e);
            System.out.println("stack trace======>");
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        SavingData.saveData();
    }
}

ma​​pping.xml

<hibernate-mapping>
    <class name="com.java.commons.Movie" table="movie" schema="hibernate">
        <id name="id" type="int" column="id">
            <generator class="identity" />
        </id>
        <property name="title" column="tittle" />
        <property name="synopsis" column="synopsis" />
        <property name="director" column="director" />

    </class>
</hibernate-mapping>

错误日志

error=======> org.hibernate.exception.GenericJDBCException: could not execute statement
stack trace======>
org.hibernate.exception.GenericJDBCException: could not execute statement
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:109)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:95)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:207)
    at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:84)
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:42)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2792)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3362)
    at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:81)
    at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:597)
    at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:232)
    at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:213)
    at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:256)
    at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:317)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:272)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:178)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:109)
    at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:189)
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:132)
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:58)
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:775)
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:748)
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:753)
    at com.java.saveData.SavingData.saveData(SavingData.java:24)
    at com.java.saveData.SavingData.main(SavingData.java:37)
Caused by: java.sql.SQLException: Field 'id' doesn't have a default value
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:957)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3878)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3814)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2478)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2625)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2551)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1861)
    at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2073)
    at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2009)
    at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5094)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1994)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:204)
    ... 21 more

根据文档生成器类型标识可以使用默认值,并且在新数据库中默认值始终为 0,当我执行此操作时会提供错误,现在实际的问题是我是否遗漏了什么? 谁能告诉我错误的原因以及如何解决? 和帮助表示赞赏。 问候和感谢。

【问题讨论】:

  • @manu 如果我正在使用其他策略类型,例如自动和增量,它可以正常工作,但是当它带有生成类型标识时,它会抛出错误。所以我想你可以检查一下。

标签: java mysql database hibernate orm


【解决方案1】:
  1. 将 id 类型从 int 更改为 Integer
  2. 确保使用自动模式生成hibernate.hbm2ddl.auto="update"
  3. 如果您不使用自动模式生成,请确保 Movie 表有一个带有 AUTO_INCREMENT 的 id

【讨论】:

  • 已更改数据库,现在一切正常,谢谢 :)
【解决方案2】:

在你的stack中,hibernate生成的SQL代码不会生成任何id。一种解决方案是将 MySQL 中的 id 列设置为“自动增量”,插入时会生成一个数字。

如果这不起作用,请保持自动增量并在您的映射中使用:

<generator class="native"/>

【讨论】:

  • native 很好,但我正在检查类型标识(学习),是的,增量工作正常。类型标识有什么解决方案吗?但感谢您的帮助:)
  • 对不起,我不知道原生是如何工作的,现在原生也可以正常工作
【解决方案3】:

在数据库中创建一个序列并定义生成器如下,那么它肯定可以工作:

<generator class="sequence">
        <param name="sequence">sequence_name</param>
</generator>

【讨论】:

  • 感谢帮助,MySQL 数据库不支持序列
【解决方案4】:
<hibernate-mapping>
    <class name="com.java.commons.Movie" table="movie" schema="hibernate">
        <id name="id" type="int" column="id">
            <generator class="identity"/>
        </id>
        <property name="title" column="tittle" />
        <property name="synopsis" column="synopsis" />
        <property name="director" column="director" />

    </class>
</hibernate-mapping>

【讨论】:

  • 遗憾的是mysql不支持序列
  • id INT(11) NOT NULL AUTO_INCREMENT 在数据库列中并与之映射: 而不是
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
相关资源
最近更新 更多