Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como anotar o campo de incremento automático do MYSQL com anotações JPA


Para usar um MySQL AUTO_INCREMENT coluna, você deve usar uma IDENTITY estratégia:
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;

Qual é o que você obteria ao usar AUTO com MySQL:
@Id @GeneratedValue(strategy=GenerationType.AUTO)
private Long id;

O que na verdade é equivalente a
@Id @GeneratedValue
private Long id;

Em outras palavras, seu mapeamento deve funcionar. Mas o Hibernate deve omitir o id coluna na instrução SQL insert e não é. Deve haver uma espécie de incompatibilidade em algum lugar.

Você especificou um dialeto MySQL em sua configuração do Hibernate (provavelmente MySQL5InnoDBDialect ou MySQL5Dialect dependendo do motor que você está usando)?

Além disso, quem criou a tabela? Você pode mostrar o DDL correspondente?

Acompanhamento: Não consigo reproduzir seu problema. Usando o código de seu entidade e seu DDL, o Hibernate gera o seguinte SQL (esperado) com o MySQL:
insert 
into
    Operator
    (active, password, username) 
values
    (?, ?, ?)

Observe que o 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 isso não acontecer para você, talvez algo esteja fora de sincronia (faça uma compilação limpa, verifique o diretório de compilação, etc) ou algo está errado (verifique os logs para ver se há algo suspeito).

Em relação ao dialeto, o somente diferença entre MySQL5Dialect ou MySQL5InnoDBDialect é que o último adiciona ENGINE=InnoDB aos objetos da tabela ao gerar o DDL. Usar um ou outro não altera o SQL gerado.