Zmiany w zachowaniu interfejsu API Java Persistence API 2.1

Jeśli w aplikacjach jest już używana opcja jpa-2.0 , należy kontynuować korzystanie z opcji jpa-2.0 dla istniejących aplikacji, aby uniknąć problemów z migracją. W przypadku nowych aplikacji najlepiej jest korzystać z opcji jpa-2.1 , która umożliwia korzystanie z nowych funkcji dostępnych w specyfikacji JPA 2.1. Aby zmienić istniejące aplikacje w taki sposób, aby korzystały z opcji jpa-2.1 zamiast opcji jpa-2.0 , może być konieczne dostosowanie aplikacji w procesie migracji.

Różnice między jpa-2.0 i jpa-2.1

Należy pamiętać o kilku istotnych różnicach między opcjami jpa-2.0 i jpa-2.1 . Patrz:

Różnice nazw klas dostawcy persistenceProvider
jpa-2.0
  • Dostawca IBM® :com.ibm.websphere.persistence.PersistenceProviderImpl
  • Dostawca OpenJPA: org.apache.openjpa.persistence.PersistenceProviderImpl
jpa-2.1
  • org.eclipse.persistence.jpa.PersistenceProvider
Różnice w działaniu buforowania

jpa-2.0: buforowanie jest domyślnie wyłączone. Jeśli aplikacja wymaga skorzystania z pamięci podręcznej L2 , należy ją jawnie włączyć.

jpa-2.1: Domyślnie dostawca EclipseLink ma włączoną pamięć podręczną L2 i pamięć podręczną QueryCache. Należy upewnić się, że to ustawienie jest najlepszą opcją dla aplikacji. Jeśli użytkownik pracuje w środowisku rozproszonym, podobnie jak w przypadku klastra, należy wyłączyć pamięć podręczną lub zrozumieć, że różne węzły mogą mieć różne dane.

Różnice w zakresie wzmocnienia/tkania

jpa-2.0: OpenJPA wymaga, aby jednostki zostały rozszerzone. Więcej informacji na ten temat zawiera sekcja Wzmocnienie jednostek JPA dla standardu JPA 2.0 w dokumentacji produktu.

jpa-2.1: EclipseLink współpracuje z nierozszerzonym obiektami. Serwer WebSphere Application Server obsługuje rozszerzenia statyczne.

Niektóre funkcje mogą nie być dostępne, takie jak ładowanie opóźnione i niektóre korzyści z wydajności.

  • Jeśli klasy jednostki są rozszerzane statycznie w celu użycia z dostawcą usług jpa-2.0 (OpenJPA), klasy muszą zostać zrekompilowane przed użyciem dostawcy jpa-2.1 .
  • Jeśli opcja Liberty jest skonfigurowana do korzystania z opcji jpa-2.1 , a jednostki są rozszerzone za pomocą rozszerzenia OpenJPA, zgłaszany jest następujący błąd:
    java.lang.NoClassDefFoundError: 
    org.apache.openjpa.enhance.PersistenceCapable.
  • NoClassDefFoundError występuje, ponieważ klasy OpenJPA nie są dostępne dla serwera w czasie wykonywania, gdy serwer Liberty jest skonfigurowany do używania produktu jpa-2.1.
    • Aby rozwiązać ten problem, należy ponownie skompilować aplikację i upewnić się, że obiekty nie zostały rozszerzone o wzmacniacz OpenJPA. Nie poprawiaj obiektów w ogóle, lub rozszerz jednostki, używając rozszerzenia EclipseLink zamiast rozszerzenia OpenJPA.
    • Alternatywnie można pozostawić obiekty w ich rozszerzonym stanie i ponownie skonfigurować opcję Liberty , aby używać funkcji produktu jpa-2.0 . Wynikiem tego jest utrata funkcjonalności z interfejsu JPA 2.1.
Różnice w używaniu źródła danych

Opcja jpa-2.0 oszczędnie korzysta z źródła danych non-jta-datasource, dlatego podczas strojenia aplikacji wymagane są tylko połączenia inne niż jta-datasource.

Produkt jpa-2.1 używa połączenia innego niż jta-datasource podczas odczytywania danych, a transakcja nie jest aktywna. Oznacza to, że pule połączeń inne niż jta-źródło danych muszą być większe podczas korzystania z tej funkcji.

Więcej różnic między dwoma dostawcami JPA można znaleźć na stronie OpenJPA-> Podręcznik migracji produktu EclipseLink .

Funkcje JPA 2.1 dostępne w OpenJPA

Interfejs OpenJPA, dostawca JPA 2.0, posiada funkcje, które działają podobnie do nowych funkcji JPA 2.1. Oznacza to, że jeśli istnieje aplikacja, która korzysta z opcji jpa-2.0 i chce korzystać z niektórych funkcji JPA 2.1, nie trzeba przełączać się do opcji jpa-2.1 . Zamiast tego można użyć odpowiednika nowego składnika udostępnionego przez interfejs OpenJPA. Niektóre z kluczowych funkcji JPA 2.1, które są dostępne w OpenJPA to:

generowanie schematu

Za pomocą tej funkcji można generować instrukcje DDL lub komunikować się bezpośrednio z bazą danych w celu zdefiniowania schematów tabel w oparciu o definicję jednostki JPA. Więcej informacji na ten temat można znaleźć w sekcji sekcja 9.4 specyfikacji JPA 2.1.

Odpowiednik OpenJPA: Schema Mapper (Program odwzorowujący schemat)

Wykresy jednostek

Za pomocą tej funkcji można określić pobieranie lub przetwarzanie wykresu obiektów obiektów. Więcej informacji na ten temat można znaleźć w sekcji 3.7 specyfikacji JPA 2.1.

Funkcja równoważna OpenJPA: FetchPlan i FetchGroup

Zapisane zapytania dotyczące procedury

Za pomocą tej funkcji można wywoływać procedury zapisane w bazach danych. Więcej informacji na ten temat można znaleźć w sekcji sekcja 3.10.17 specyfikacji JPA 2.1.

Odpowiednik OpenJPA: Wywołanie zapytania

Konwersja podstawowego typu atrybutu

Za pomocą tej funkcji można dokonać konwersji między reprezentacją jednostki atrybutów a reprezentacją bazy danych dla atrybutów typu podstawowego. Więcej informacji na ten temat można znaleźć w sekcji 3.8 specyfikacji JPA 2.1.

Funkcja równoważna OpenJPA: składnik Externalizer

Adnotacje @Index i @ForeignKey

Zapoznaj się z sekcjami 11.1.19 i 11.1.23 specyfikacji JPA 2.1.

Odpowiednik OpenJPA: OpenJPA @Index i @ForeignKey.

Odpakowanie metod narzędziowych dla interfejsu EntityManager, pamięci podręcznej

Zapoznaj się z sekcjami 3.1.1 i 7.10 specyfikacji JPA 2.1.

Funkcje równoważne interfejsu OpenJPA: EntityManagerImpl.unwrap () i OpenJPAPersistence.cast ().

Budowanie obiektów podczas odwzorowywania wyników z rodzimego kodu SQL

Należy zapoznać się z sekcją 3.10.16.2.2 specyfikacji JPA 2.1.

Równoważna funkcja OpenJPA: obiekt ResultShape .