Apoiando diferentes GenerationTypes JPA de Teste / Produção
-
18-09-2019 - |
Pergunta
Eu quero usar GenerationType.IDENTITY para chaves primárias em meu sistema MySQL produção. Mas para desenvolvimento e teste local, eu gostaria de usar HSQLDB. O problema é que HSQLDB não suporta GenerationType.IDENTITY (pelo menos com EclipseLink). Tentei configurar GenerationType.AUTO, cujo padrão é TABLE para HSQLDB, mas, infelizmente, ele faz o mesmo para o MySQL, o que não é o que eu quero. Existe alguma maneira de substituir esse em persistence.xml? Existe algum outro truque que eu posso usar para que cada ambiente faz a coisa certa? Eu não tenho qualquer configuração entidade criada em XML (é tudo em anotações) e eu não quero mudar isso, então estou procurando uma maneira que evita isso.
Solução
A idéia básica aqui é usar um gerador personalizado que iria mudar internamente entre identidade e tabela (ou o que quer que as estratégias mais que você precisa) com base em informações de metadados.
Não há nenhuma maneira de fazer isso usando JPA padrão, no entanto. Enquanto anotação @GeneratedValue
faz definir parâmetro generator
que permite especificar um gerador personalizado ele não fornece quaisquer mecanismos para escrever um (somente permitindo que você use built-in geradores Tabela / Sequência).
É até um fornecedor específico JPA para (não) implementar essa funcionalidade. EclipseLink wiki tem um exemplo de como gerador personalizado pode ser definido. Você vai precisar de alterá-lo para criar instâncias TableSequence
/ NativeSequence
internamente e alternar entre os dois com base em session.getPlatform()
.
Disclaimer: Eu não tentei o acima usando EclipseLink; Eu fiz algo muito semelhante em Hibernate, no entanto.
Outras dicas
HSQLDB, obviamente, faz-se apoiar colunas de identidade (definitivamente em v1.8), então isso é uma falha no EclipseLink. Por exemplo, DataNucleus fornece suporte IDENTIDADE para HSQLDB.
Especificando usando XML tem seus benefícios para cross-armazenamento de dados de implantação, como você claramente sabe.