JPA Primária Key Auto Gere
Pergunta
Minha entidade chave principal é a aparência abaixo
@GeneratedValue(strategy= GenerationType.TABLE)
private Long id;
Quando eu corro, recebo erro
Não foi possível obter ou atualizar o próximo valor; exceção aninhada é org.hibernate.exception.sqlGramamrexception: não foi possível obter ou atualizar o próximo valor
Mas quando eu apenas mudei para
@GeneratedValue
private Long id;
nenhum erro de erro. Eu quero gerar chave primária exclusiva por tabela oráculo dB.
Solução
o @GeneratedValue(strategy=GenerationType.TABLE)
Diz ao provedor JPA para usar uma tabela para obter IDs ao inserir entidades recém -criadas no banco de dados.
Ao usar o Hibernate como provedor, isso resultará em uma tabela hibernate_sequences
que possui duas colunas: o nome da entidade e a identidade máxima já atribuída a essa entidade. Aqui, parece que o Hibernate não consegue obter o próximo ID da sua entidade, mas é difícil dizer exatamente por que, porque você não forneceu informações suficientes para isso.
Então, você poderia fornecer o empilhamento completo? Além disso, gire o log com hibernate.show_sql
propriedade definida como true
e defina o nível de log adequado log4j.logger.org.hibernate.SQL=DEBUG
. Junte -se ao registro da sua pergunta, se possível.
Talvez apenas verifique se você configurou o correto hibernate.dialect
para Oracle. Na verdade, junte -se à sua configuração de hibernato também, se possível.
PS: A maneira "tradicional" de gerar PK com o Oracle é usar sequências (você pode deixar o Hibernate adivinhar a melhor estratégia para o seu tipo de banco de dados usando GenerationType.AUTO
ou forçar -o usando SEQUENCE
) Mas assumirei que você deseja que a estrutura de dados resultante seja agnóstica do banco de dados. Caso contrário, eu sugiro optar por sequências.
Editar: Respondendo a um comentário do OP sobre GenerationType.AUTO
. De fato, o padrão é uma única sequência global chamada hibernate_sequence
E isso pode ser um problema. Mas, com a configuração mostrada abaixo, você pode usar GenerationType.AUTO
e ainda controlar o nome da sequência para os casos em que o banco de dados usa sequências:
@Id
@GeneratedValue(strategy=GenerationType.AUTO, generator="my_entity_seq_gen")
@SequenceGenerator(name="my_entity_seq_gen", sequenceName="MY_ENTITY_SEQ")
private long id;
Em outras palavras, você pode usar um nome de sequência diferente para cada tabela sem perder a portabilidade.
Outras dicas
Existem 4 estratégias para a geração de automóveis no JPA:
- Auto
- Identidade
- Seqüência
- Mesa
Para o Oracle Auto Generation Primary Key Anotation, sequência e tabela são suas escolhas. A lógica básica é definir um gerador primeiro, use @SequenceGenerator ou @TableGenerator respectivamente, então use o gerador como atributo em @GeneratedValue.
Esta é uma amostra de como usar a estratégia de sequência:
@Id
@SequenceGenerator(name="SEQ_GEN", sequenceName="SEQ_JUST_FOR_TEST", allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_GEN")
private long id;
Aqui está um exemplo de como usar a estratégia de tabela:
@Id
@TableGenerator(name="TABLE_GEN",table="T_GENERATOR", pkColumnName = "GEN_KEY", pkColumnValue = "MONITOR2012.T_JUST_FOR_TEST", valueColumnName = "GEN_VALUE", initialValue = 1, allocationSize = 1 )
@GeneratedValue(strategy = GenerationType.TABLE, generator="TABLE_GEN")
private long id;
Se nenhum gerador especificado em @GeneratedValue Anotação, a opção deixará para a implementação da JPA.
Se você estiver trabalhando no banco de dados com as tabelas existentes, verifique se a sequência ou a tabela definida no banco de dados antes de executar seu aplicativo. O gerador de tabela também precisará que você insira uma linha na tabela antes que a anotação @GeneratedValue possa funcionar corretamente.
Aqui está um tutorial sobre Como configurar a geração automática de chave primária no banco de dados JPA para Oracle.