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). Zautomatyzowany zostanie dostarczony tam, gdzie zastąpi oflagowane @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
klasa publiczna GeneratedValueEntity {

    @Id @GeneratedValue private int id; }

Automatyczna poprawka zmodyfikuje adnotację @GeneratedValue i doda adnotację @TableGenerator adnotację.

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

@Entity
klasa publiczna 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.