Zgodnie ze specyfikacją interfejsu API Java Persistence (JPA), jeśli jednostka definiuje atrybut z adnotacją EmbeddedId, możliwa do osadzenia klasa nie może zawierać atrybutu z adnotacją Id. Jeśli zdefiniowano zarówno adnotację EmbeddedId, jak i adnotację Id, interfejs OpenJPA ignoruje adnotację Id, natomiast interfejs EclipseLink zgłasza wyjątek.
Ta reguła skanuje klasy Embeddable zawierające atrybuty z adnotacją Id, a następnie oznacza adnotację Id w zależności od tego, czy znajdzie jednostkę, która odwołuje się do możliwej do osadzenia klasy za pomocą adnotacji EmbeddedId.
EmbeddedId odwołuje się do możliwej do osadzenia klasy, która ma adnotację Id, oznacza adnotację Id jako poważny problem. Do usunięcia adnotacji Id można użyć szybkiej poprawki.
EmbeddedId, oznacza ten problem jako ostrzeżenie. Można rozszerzyć zasięg analizy, uwzględniając dowolne atrybuty z adnotacją EmbeddedId, które mogą odwoływać się do możliwej do osadzenia klasy, i ponownie uruchomić skanowanie. Można również ręcznie sprawdzić, czy adnotacje EmbeddedId odwołują się do klasy możliwej do osadzenia.
W tym przykładzie reguła powoduje oznaczenie adnotacji Id w klasie EmbeddableObject.
import javax.persistence.EmbeddedId; import javax.persistence.Entity; @Entity public class MainEntity { @EmbeddedId private EmbeddableObject eo; } |
import javax.persistence.Embeddable; import javax.persistence.Id; @Embeddable public class EmbeddableObject { @Id private int field; ... } |
W celu rozwiązania tego problemu szybka poprawka usuwa adnotację @Id i jej import.
import javax.persistence.Embeddable; import javax.persistence.Id; @Entity public class MainEntity { @EmbeddedId private EmbeddableObject eo; } |
import javax.persistence.Embeddable; @Embeddable public class EmbeddableObject { private int field; ... } |
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.