Estou enfrentando o que considero um problema simples com o Hibernate, mas não consigo resolvê-lo (os fóruns do Hibernate inacessíveis certamente não ajudam).
Eu tenho uma classe simples que gostaria de persistir, mas continuo recebendo:
SEVERE: Field 'id' doesn't have a default value
Exception in thread "main" org.hibernate.exception.GenericJDBCException: could not insert: [hibtest.model.Mensagem]
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
[ a bunch more ]
Caused by: java.sql.SQLException: Field 'id' doesn't have a default value
[ a bunch more ]
O código relevante para a classe persistida é:
package hibtest.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Mensagem {
protected Long id;
protected Mensagem() { }
@Id
@GeneratedValue
public Long getId() {
return id;
}
public Mensagem setId(Long id) {
this.id = id;
return this;
}
}
E o código em execução real é simples:
SessionFactory factory = new AnnotationConfiguration()
.configure()
.buildSessionFactory();
{
Session session = factory.openSession();
Transaction tx = session.beginTransaction();
Mensagem msg = new Mensagem("YARR!");
session.save(msg);
tx.commit();
session.close();
}
Tentei algumas "estratégias" na GeneratedValue
anotação, mas parece que não funciona. A inicialização id
também não ajuda! (por exemplo Long id = 20L
).
Alguém poderia lançar alguma luz?
EDIT 2: confirmado: mexer com @GeneratedValue(strategy = GenerationType.XXX)
não resolve
RESOLVIDO: recriar o banco de dados resolveu o problema
java
hibernate
jpa
persistence
André Chalella
fonte
fonte
GenerationType
em@GeneratedValue
partirIDENTITY
paraAUTO
e funcionou para mim. Além disso, você pode ter a propriedade de incremento automático definida no MySQL.Respostas:
Às vezes, as alterações feitas no modelo ou no ORM podem não refletir com precisão no banco de dados, mesmo após a execução de
SchemaUpdate
.Se, na verdade, o erro parece não ter uma explicação sensata, tente recriar o banco de dados (ou pelo menos criar um novo) e faça o andaime com ele
SchemaExport
.fonte
SET foreign_key_checks = 0;
é seu amigo. Apenas certifique-se deSET foreign_key_checks = 1;
quando terminar.Se você deseja que o MySQL produza chaves primárias automaticamente, é necessário informar ao criar a tabela. Você não precisa fazer isso no Oracle.
Na chave primária, você deve incluir
AUTO_INCREMENT
. Veja o exemplo abaixo.Aqui está a entidade
fonte
você deve estar usando update em sua propriedade hbm2ddl. faça as alterações e atualize-o para Criar para que possa criar a tabela.
Funcionou para mim.
fonte
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id;
E com o valorcreate
nahbm2ddl.auto
propriedade as alterações aplicadas no meu esquema de banco de dados. Muito obrigado ....Dê uma olhada na
GeneratedValue
estratégia de. Normalmente, é algo como:fonte
Descartar a tabela do banco de dados manualmente e depois executar novamente o aplicativo funcionou para mim. No meu caso, a tabela não foi criada corretamente (com restrições), eu acho.
fonte
Eu tive esse problema. Meu erro foi que eu tinha definido os arquivos inseríveis e atualizáveis como false e estava tentando definir o campo na solicitação. Este campo é definido como NULL NULL no DB.
Mais tarde eu mudei para - insertable = true, atualizável = true
Funcionou perfeitamente depois.
fonte
Eu vim aqui por causa da mensagem de erro, acontece que eu tinha duas tabelas com o mesmo nome.
fonte
Outra sugestão é verificar se você usa um tipo válido para o campo gerado automaticamente. Lembre-se de que não funciona com String, mas funciona com Long:
A sintaxe acima trabalhou para gerar tabelas no MySQL usando o Hibernate como um provedor JPA 2.0.
fonte
Eu tive o mesmo problema. Encontrei o tutorial Exemplo de mapeamento individual do Hibernate usando Anotação de chave estrangeira e o segui passo a passo, como abaixo:
Crie uma tabela de banco de dados com este script:
Aqui estão as entidades com as tabelas acima
O problema foi resolvido.
Aviso: a chave primária deve ser definida como AUTO_INCREMENT
fonte
Basta adicionar restrição não nula
Eu tive o mesmo problema. Acabei de adicionar restrição não nula no mapeamento xml. Funcionou
fonte
Talvez esse seja o problema com o esquema da tabela. solte a tabela e execute novamente o aplicativo.
fonte
Além do mencionado acima, não se esqueça de criar a tabela sql para fazer o INCREMENTO AUTOMÁTICO, como neste exemplo
fonte
Verifique se o valor padrão para o ID da coluna em particular table.if não torná-lo como padrão
fonte
Eu tive o mesmo problema. Eu estava usando uma tabela de junção e tudo o que tinha com um campo de identificação de linha e duas chaves estrangeiras. Não sei exatamente o que foi causado, mas fiz o seguinte
Certifique-se de que eu tinha métodos de código de hash e iguais
fonte
A mesma exceção foi lançada se uma tabela do banco de dados tivesse uma coluna antiga não removida.
Por exemplo:
attribute_id NOT NULL BIGINT(20),
eattributeId NOT NULL BIGINT(20),
Depois de remover o atributo não usado, no meu caso contractId , o problema foi resolvido.
fonte
Isso aconteceu comigo com um
@ManyToMany
relacionamento. Anotei um dos campos no relacionamento@JoinTable
, removi-o e usei omappedBy
atributo em @ManyToMany.fonte
Eu tentei o código e, no meu caso, o código abaixo resolve o problema. Eu não havia resolvido o esquema corretamente
Por favor, tente adicionar
,catalog="databasename"
o mesmo que eu fiz.fonte
No meu caso, alterei as tabelas incorretas e o campo "id" em questão, criei AUTO_INCREMENT, ainda preciso descobrir por que, no tempo de implantação, não estava tornando "AUTO_INCREMENT" para que eu próprio fizesse isso sozinho!
fonte
Que tal isso:
Espero que ajude você.
fonte
Tente alterar o
Long
tipo de objeto paralong
o tipo primitivo (se o uso de primitivas estiver correto para você).Eu tive o mesmo problema e a mudança de tipo me ajudou.
fonte
Eu tive esse problema, por engano, coloquei a
@Transient
anotação acima desse atributo específico. No meu caso, esse erro faz sentido.fonte
"O campo 'id' não tem um valor padrão" porque você não declarou
GenerationType.IDENTITY
naGeneratedValue
anotação.fonte
Esse problema ocorre porque, algumas vezes, você precisa atualizar / criar novamente o banco de dados ou, algumas vezes, se você adicionou o campo na tabela db, mas não a classe de entidade, não é possível inserir nenhum valor nulo ou zero, de modo que esse erro ocorreu. Portanto, verifique as classes side.Db e Entity.
fonte
Quando seu campo não é anulável, é necessário que um valor padrão seja especificado na criação da tabela. Recrie uma tabela com AUTO_INCREMENT inicializado corretamente, para que o banco de dados não exija valor padrão, pois ele o gerará por si só e nunca colocará NULL lá.
);
https://www.w3schools.com/sql/sql_autoincrement.asp
fonte
Eu tenho esse erro no GCP cloud sql quando o campo de modelo não corresponde ao campo de tabela correto no banco de dados. Exemplo: quando no campo modelo é
fieldName
tabela em db deve ter o campo
field_name
Fixing table field name me ajudou.fonte
Adicione um método
hashCode()
à sua Entity Bean Class e tente novamentefonte