Attribute mit automatisch generierten Werten müssen konfiguriert werden

OpenJPA und EclipseLink erstellen unterschiedliche Tabellen, um Werte für Attribute mit der Annotation @GeneratedValue oder der Annotation @GeneratedValue(strategy=GenerationType.AUTO) zu generieren. Wenn Ihre Anwendung Entitäten mit Attributen enthält, die von OpenJPA generiert wurden, tritt beim persistenten Speichern neuer Entitäten mit EclipseLink ein Fehler auf, weil EclipseLink versucht, diese Werte anhand der EclipseLink-Tabelle zu generieren.

Sie können dieses Problem beheben, indem Sie die Entität so konfigurieren, dass die OpenJPA-Sortiertabelle für die Generierung der Attributwerte verwendet wird. Daraufhin verwendet EclipseLink den letzten in der OpenJPA-Tabelle aufgelisteten Wert, um den Attributwert zu generieren.

Diese Regel sucht nach Attributen, die mit @GeneratedValue oder @GeneratedValue(strategy=GenerationType.AUTO) annotiert sind. Es wird ein Automatismus zur Verfügung gestellt, der die markierten @GeneratedValue anmerkung durch die folgenden Anmerkungen ersetzt:

  @TableGenerator(name = "OPENJPA_SEQUENCE_TABLE", table = "OPENJPA_SEQUENCE_TABLE", pkColumnName = "ID", valueColumnName = "SEQUENCE_VALUE", pkColumnValue = "0")
  @GeneratedValue(strategy = GenerationType.TABLE, generator = "OPENJPA_SEQUENCE_TABLE")

Die Regel markiert beispielsweise die Annotation @GeneratedValue in der folgenden Entitätsklasse für Feldzugriffe.

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id

@Entity
Entität public class GeneratedValue{

    @Id @GeneratedValue private int id;}

Die automatische Korrektur ändert die @GeneratedValue bemerkung und fügt die @TableGenerator bemerkung.

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id

@Entity
Entität public class GeneratedValue{

    @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;}

Informationen zu diesem Problem und zu weiteren Problemen bei der Migration von OpenJPA auf EclipseLink finden Sie in der Veröffentlichung OpenJPA to EclipseLink JPA Migration: Mappings.