Atrybuty z automatycznie generowanymi wartościami wymagają konfiguracji

Interfejsy OpenJPA i EclipseLink tworzą różne tabele w celu generowania wartości dla atrybutów, które mają adnotację @GeneratedValue lub @GeneratedValue(strategy=GenerationType.AUTO). Jeśli aplikacja zawiera obiekty z atrybutami wygenerowanymi przez interfejs OpenJPA, utrwalanie nowych obiektów za pomocą interfejsu EclipseLink powoduje wystąpienie błędu, ponieważ interfejs EclipseLink podejmuje próbę wygenerowania tych wartości z tabeli EclipseLink.

Ten problem rozwiązuje się przez skonfigurowanie użycia przez jednostkę tabeli sekwencji OpenJPA do generowania wartości atrybutu. Dzięki temu w celu wygenerowania wartości atrybutu interfejs EclipseLink używa ostatniej wartości wymienionej w tabeli OpenJPA.

Ta reguła wykonuje skanowanie w poszukiwaniu atrybutów z adnotacjami @GeneratedValue lub @GeneratedValue(strategy=GenerationType.AUTO). Szybka poprawka zastępuje oznaczoną adnotację @GeneratedValue następującymi adnotacjami:

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

Na przykład reguła oznacza adnotację @GeneratedValue w następującej klasie jednostki dostępu do pola.

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

@Entity
public class GeneratedValueEntity {

    @Id
    @GeneratedValue
    private int id;

}

Szybka poprawka modyfikuje adnotację @GeneratedValue i dodaje adnotację @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;
}

Informacje na ten temat oraz na temat innych problemów z migracją interfejsu OpenJPA do interfejsu EclipseLink zawiera podręcznik Migracja interfejsu JPA ze środowiska OpenJPA do EclipseLink: Odwzorowania.