OpenJPA et EclipseLink créent différentes tables afin de générer des valeurs pour les attributs associés à l'annotation @GeneratedValue ou @GeneratedValue(strategy=GenerationType.AUTO).
Si votre application contient des entités dotées d'attributs générés par OpenJPA, la persistance des nouvelles entités à l'aide d'EclipseLink provoque une erreur car EclipseLink tente de générer ces valeurs à partir de la table EclipseLink.
Ce problème est résolu en configurant l'entité pour utiliser la table de séquence OpenJPA pour générer les valeurs d'attribut. Ainsi, EclipseLink utilise la dernière valeur énumérée dans la table OpenJPA pour générer la valeur d'attribut.
Cette règle recherche des attributs annotés avec @GeneratedValue ou @GeneratedValue(strategy=GenerationType.AUTO).
Un automatisme sera fourni à l'endroit où il remplacera le drapeau @GeneratedValue par les annotations suivantes :
@TableGenerator(name = "OPENJPA_SEQUENCE_TABLE", table = "OPENJPA_SEQUENCE_TABLE", pkColumnName = "ID", valueColumnName = "SEQUENCE_VALUE", pkColumnValue = "0") @GeneratedValue(strategy = GenerationType.TABLE, generator = "OPENJPA_SEQUENCE_TABLE")
Par exemple, la règle marque l'annotation @GeneratedValue dans la classe entité avec accès FiELD suivante :
import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity classe publique GeneratedValueEntity { @Id @GeneratedValue private int id ; }
Le correctif automatisé modifie l'annotation @GeneratedValue et ajoute l'annotation @TableGenerator annotation.
import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity classe publique 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 ; }
Pour des informations sur ce problème et d'autres problèmes de migration d'OpenJPA vers EclipseLink, voir le guide OpenJPA to EclipseLink JPA Migration: Mappings.