OpenJPA-Annotation @PersistentCollection durch @ElementCollection und @Column ersetzen

OpenJPA erstellt eine separate Tabelle für Sammlungsattribute, die mit org.apache.openjpa.persistence.PersistentCollection annotiert sind. Um in EclipseLink dasselbe Verhalten zu erreichen, ersetzen Sie diese Annotationen gemäß der JPA-Spezifikation durch die Annotationen @ElementCollection und @Column. Wenn Sie die Annotation @PersistentCollection entfernen und die Annotationen @ElementCollection und @Column nicht hinzufügen, behandelt EclipseLink das Feld als BLOB und versucht, eine Spalte für die Daten in der Entitätstabelle zu erstellen.

Diese Regel sucht nach org.apache.openjpa.persistence.PersistentCollection-Annotationen, damit Sie sie manuell migrieren können. Führen Sie die folgenden Schritte aus, um Annotationen zu migrieren:

  1. Ersetzen Sie die Annotation @org.apache.openjpa.persistence.PersistentCollection durch folgende Annotationen:
    @javax.persistence.ElementCollection
    @javax.persistence.Column(name="element")
    
    Wenn es die Annotation @Column im Attribut bereits gibt, dürfen Sie weder eine weitere Annotation hinzufügen noch den Namen ändern.
  2. Ändern Sie Arrays in Objektsammlungen. Verwenden Sie primitive Wrappertypen anstelle primitiver Elemente.

Diese Regel markiert beispielsweise die Annotation @PersistentCollection in der folgenden Entitätsklasse:


import javax.persistence.Entity;
import javax.persistence.Id;
import org.apache.openjpa.persistence.PersistentCollection;

@Entity
public class IntArrayEntity{
    @Id
    private int id;
    
    @PersistentCollection
    private int[] arrayOfInts;

}

Zum Migrieren dieser Entität ersetzen Sie die Annotation und ändern Sie das int-Array in eine Liste von Integer-Objekten: List<Integer>.

import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class IntArrayEntity{
    @Id
    private int id;
    
    @ElementCollection
    @Column(name = "element")
    private List<Integer> arrayOfInts;
}

Informationen zu diesem Problem bei der Migration von OpenJPA auf EclipseLink finden Sie im Handbuch Migration from OpenJPA to EclipseLink JPA: Extended Functionality.