Les attributs comportant des valeurs automatiquement générées nécessitent une configuration

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). Le correctif rapide remplace l'annotation @GeneratedValue marquée 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
public class GeneratedValueEntity {

    @Id
    @GeneratedValue
    private int id;

}

Le correctif rapide modifie l'annotation @GeneratedValue et ajoute l'annotation @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;
}

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.