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. Die Schnellkorrektur ersetzt die markierte Annotation @GeneratedValue durch die folgenden Annotationen:

  @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
public class GeneratedValueEntity {

    @Id
    @GeneratedValue
    private int id;

}

Die Schnellkorrektur ändert die Annotation @GeneratedValue und fügt die Annotation @TableGenerator hinzu.

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

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.