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.

Foi útil?

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.

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