Direto ao ponto, o problema é salvar o objeto Operator no banco de dados MySQL. Antes de salvar, tento selecionar nesta tabela e funciona, assim como a conexão com o banco de dados.
Aqui está meu objeto Operator:
@Entity
public class Operator{
@Id
@GeneratedValue
private Long id;
private String username;
private String password;
private Integer active;
//Getters and setters...
}
Para economizar, uso EntityManager
o persist
método JPA .
Aqui está algum registro:
Hibernate: insert into Operator (active, password, username, id) values (?, ?, ?, ?)
com.mysql.jdbc.JDBC4PreparedStatement@15724a0: insert into Operator (active,password, username, id) values (0, 'pass', 'user', ** NOT SPECIFIED **)
A meu ver, o problema é a configuração com incremento automático, mas não consigo descobrir onde.
Tentei alguns truques que vi aqui: Hibernate não respeitando o campo de chave primária do MySQL auto_increment Mas nada disso funcionou
Se for necessário algum outro arquivo de configuração, irei fornecê-lo.
DDL:
CREATE TABLE `operator` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`first_name` VARCHAR(40) NOT NULL,
`last_name` VARCHAR(40) NOT NULL,
`username` VARCHAR(50) NOT NULL,
`password` VARCHAR(50) NOT NULL,
`active` INT(1) NOT NULL,
PRIMARY KEY (`id`)
)
Respostas:
Para usar uma
AUTO_INCREMENT
coluna MySQL , você deve usar umaIDENTITY
estratégia:Que é o que você obtém ao usar o
AUTO
MySQL:O que é equivalente a
Em outras palavras, seu mapeamento deve funcionar. Mas o Hibernate deveria omitir a
id
coluna na instrução de inserção SQL, e não é. Deve haver um tipo de incompatibilidade em algum lugar.Você especificou um dialeto do MySQL na configuração do Hibernate (provavelmente
MySQL5InnoDBDialect
ouMySQL5Dialect
dependendo do mecanismo que está usando)?Além disso, quem criou a mesa? Você pode mostrar o DDL correspondente?
Acompanhamento: Não consigo reproduzir o seu problema. Usando o código de sua entidade e seu DDL, o Hibernate gera o seguinte (esperado) SQL com MySQL:
Observe que a
id
coluna está ausente da declaração acima, como esperado.Resumindo, seu código, a definição da tabela e o dialeto estão corretos e coerentes, deve funcionar. Se não for para você, talvez algo esteja fora de sincronia (faça uma compilação limpa, verifique o diretório de compilação, etc.) ou outra coisa esteja simplesmente errada (verifique se há algo suspeito nos logs).
Em relação ao dialeto, a única diferença entre
MySQL5Dialect
ouMySQL5InnoDBDialect
é que este adicionaENGINE=InnoDB
à tabela objetos ao gerar o DDL. Usar um ou outro não altera o SQL gerado.fonte
@GeneratedValue(strategy=GenerationType.IDENTITY)
quando escreve@GeneratedValue(strategy=GenerationType.AUTO)
e@GeneratedValue
. Portanto, tenha cuidado e tente ser prolixo.Usando MySQL, apenas esta abordagem funcionou para mim:
As outras 2 abordagens declaradas por Pascal em sua resposta não funcionaram para mim.
fonte
JPA
comspring-boot
eMySQL
.Para qualquer um que esteja lendo isso e esteja usando EclipseLink para JPA 2.0, aqui estão as duas anotações que tive que usar para fazer o JPA persistir os dados, onde "MySequenceGenerator" é qualquer nome que você deseja dar ao gerador, "myschema" é o nome do esquema em seu banco de dados que contém o objeto de sequência e "mysequence" é o nome do objeto de sequência no banco de dados.
Para aqueles que usam EclipseLink (e possivelmente outros provedores JPA), é CRÍTICO que você configure o atributo alocação de tamanho para corresponder ao valor INCREMENT definido para sua sequência no banco de dados. Caso contrário, você obterá uma falha de persistência genérica e perderá muito tempo tentando rastreá-la, como eu fiz. Aqui está a página de referência que me ajudou a superar este desafio:
http://wiki.eclipse.org/EclipseLink/Examples/JPA/PrimaryKey#Using_Sequence_Objects
Além disso, para dar contexto, aqui está o que estamos usando:
Java 7 Glassfish 3.1 PostgreSQL 9.1 PrimeFaces 3.2 / JSF 2.1
Além disso, por preguiça, eu construí isso no Netbeans com os assistentes para gerar entidades do banco de dados, controladores de entidades e JSF de entidades, e os assistentes (obviamente) não sabem como lidar com colunas de ID baseadas em sequência, então você terá que adicionar manualmente essas anotações.
fonte
fonte
Se você estiver usando o Mysql com Hibernate v3, não há problema em usar
GenerationType.AUTO
porque internamente ele usaráGenerationType.IDENTITY
, que é o mais ideal para MySQL.No entanto, no Hibernate v5, mudou.
GenerationType.AUTO
usará oGenerationType.TABLE
que gera muitas consultas para a inserção.Você pode evitar isso usando
GenerationType.IDENTITY
(se MySQL for o único banco de dados que você está usando) ou com estas notações (se você tiver vários bancos de dados):fonte
Eu tentei de tudo, mas ainda não consegui fazer isso, estou usando mysql, jpa com hibernate, resolvi meu problema atribuindo o valor de id 0 no construtor A seguir está meu código de declaração de id
fonte
Como você definiu o id no tipo int na criação do banco de dados, você deve usar o mesmo tipo de dados na classe do modelo também. E como você definiu o id para incremento automático no banco de dados, você deve mencioná-lo na classe do modelo passando o valor 'GenerationType.AUTO' para o atributo 'estratégia' dentro da anotação @GeneratedValue. Em seguida, o código fica como abaixo.
fonte
o mesmo que Pascal respondeu, apenas se você precisar usar .AUTO por algum motivo, você só precisa adicionar as propriedades do seu aplicativo:
fonte
você pode verificar se está conectado ao banco de dados correto. como eu estava enfrentando o mesmo problema, mas finalmente descobri que me conectei a um banco de dados diferente.
identidade oferece suporte a colunas de identidade em DB2, MySQL, MS SQL Server, Sybase e HypersonicSQL. O identificador retornado é do tipo long, short ou int.
Mais informações: http://docs.jboss.org/hibernate/orm/3.5/reference/en/html/mapping.html#mapping-declaration-id
fonte
Se você estiver usando MariaDB isso vai funcionar
Para mais informações, você pode verificar https://thorben-janssen.com/hibernate-tips-use-auto-incremented-column-primary-key/
fonte