Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Solução do erro: Field 'id' doesn't have a default value

Caso você tenha esses erros:

ERROR: Field 'id' doesn't have a default value Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: could not execute statement at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154) at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181) at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188) at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:726) at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:706) at testes.TestaRelacionamento.main(TestaRelacionamento.java:29) Caused by: 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:113) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:200) at org.hibernate.dialect.identity.GetGeneratedKeysDelegate.executeAndExtract(GetGeneratedKeysDelegate.java:57) at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:43) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3200) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3806) at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:84) at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:645) at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:282) at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:263) at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:317) at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:330) at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:287) at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:193) at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:123) at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:185) at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:128) at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:55) at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:102) at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:720) ... 2 more Caused by: java.sql.SQLException: Field 'id' doesn't have a default value at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:965) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3933) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3869) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2524) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2675) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2465) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1915) at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2136) at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2070) at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5187) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2055) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:197) ... 20 more

Você pode deletar seu database (drop database alura_jpa) e criá-lo novamente (create database alura_jpa).

Eu tive esse erro e isso resolveu meu problema. Espero ter ajudado alguém.

2 respostas
solução!

Boa Gustavo, valeu por compartilhar a solução! :D

Pela mensagem de erro, aparentemente o id não tinha um valor padrão.

Por conta do id ser um atributo marcado com a anotação @Id, ele passou a representar a chave primária da tabela no banco e, portanto, também se tornou um campo cujo preenchimento é obrigatório. É possível que quando a sua classe foi mapeada no banco pela primeira vez, não havia nenhuma strategy (para gerar o valor padrão da chave primária) associada ao atributo id e, por consequência, nenhum valor foi atribuído à chave primária id.

Porém, ao adicionar a anotação @GeneratedValue(strategy = GenerationType.IDENTITY), você delegou a responsabilidade de gerar o valor do id para o banco. Infelizmente, como você pode perceber, foi preciso recriar o banco para que a estratégia fosse posta em prática!

Nossa, então foi por causa do strategy mesmo. Realmente, quando eu criei o banco não tinha isso, por isso o problema. Obrigado Thiago!