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 wykrywa klasy Embeddable, które zawierają atrybuty z adnotacją Id, a następnie reguła flaguje adnotacje Id w zależności od tego, czy znajdzie jednostkę, która odwołuje się do osadzalnej klasy przy użyciu adnotacji EmbeddedId adnotacji.
EmbeddedId odwołuje się do możliwej do osadzenia klasy, która ma adnotację Id, oznacza adnotację Id jako poważny problem. Adnotacja Id będzie musiała zostać usunięta.
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 klasa publiczna EmbeddableObject { Pole @Id private int ... }
Aby rozwiązać ten problem, należy usunąć 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.