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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top