![](/img/trans.png)
[英]Field 'index_id' doesn't have a default value" when trying to use the primary_key as part of composite key in Hibernate
[英]generation type identity gives error that id(primary key ) doesn't have default value
我正在嘗試使用身份生成器類並遇到錯誤,因為我正在使用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();
}
}
mapping.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,當我執行此操作時會提供錯誤,現在的實際問題是我是否缺少某些內容? 誰能告訴我錯誤的原因以及如何解決? 和幫助表示贊賞。 謝謝,謝謝。
在您的堆棧中,hibernate生成的SQL代碼不會生成任何id。 一種解決方案是將MySQL中的id列設置為“ autoincrement”,插入時會生成一個數字。
如果這不起作用,請保持自動遞增並在映射中使用:
<generator class="native"/>
在數據庫中創建一個序列,並按如下所示定義生成器,那么它肯定可以工作:
<generator class="sequence">
<param name="sequence">sequence_name</param>
</generator>
<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>
int
更改為Integer
hibernate.hbm2ddl.auto="update"
Movie
表的id
列為AUTO_INCREMENT
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.