O OpenJPA e o EclipseLink criam diferentes tabelas para gerar valores para atributos que possuem a anotação @GeneratedValue ou @GeneratedValue(strategy=GenerationType.AUTO).
Se o seu aplicativo contém entidades com atributos que foram gerados pelo OpenJPA, persistir novas
entidades usando o EclipseLink causa um erro porque o EclipseLink tenta gerar estes valores a partir da tabela EclipseLink.
Este problema é resolvido ao configurar a entidade para usar a tabela de sequências OpenJPA para gerar os valores do atributo. Ao fazer isso, o EclipseLink usa o último valor listado na tabela OpenJPA para gerar o valor do atributo.
Esta regra faz a varredura para encontrar atributos que não estão anotados com @GeneratedValue ou @GeneratedValue(strategy=GenerationType.AUTO).
A correção rápida substitui a anotação @GeneratedValue sinalizada pelas anotações
a seguir:
@TableGenerator(name = "OPENJPA_SEQUENCE_TABLE", table = "OPENJPA_SEQUENCE_TABLE", pkColumnName = "ID", valueColumnName = "SEQUENCE_VALUE", pkColumnValue = "0") @GeneratedValue(strategy = GenerationType.TABLE, generator = "OPENJPA_SEQUENCE_TABLE")
Por exemplo, a regra sinaliza a anotação @GeneratedValue na classe de entidade de
acesso ao campo a seguir.
import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity public class GeneratedValueEntity { @Id @GeneratedValue private int id; } |
A correção rápida modifica a anotação @GeneratedValue e inclui a anotação
@TableGenerator.
import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity public class GeneratedValueEntity { @Id @TableGenerator(name = "OPENJPA_SEQUENCE_TABLE", table = "OPENJPA_SEQUENCE_TABLE", pkColumnName = "ID", valueColumnName = "SEQUENCE_VALUE", pkColumnValue = "0") @GeneratedValue(strategy = GenerationType.TABLE, generator = "OPENJPA_SEQUENCE_TABLE") private int id; } |
Para obter informações sobre esse problema e outros problemas de migração do OpenJPA para o EclipseLink, consulte o guia Migração do OpenJPA para o EclipseLink JPA: mapeamentos.