Podle specifikace JPA (Java Persistence API) platí, že pokud entita definuje atribut s anotací EmbeddedId, vestavitelná třída nemůže obsahovat atribut s anotací Id. Je-li definována anotace EmbeddedId i anotace Id, rozhraní OpenJPA bude ignorovat anotaci Id, zatímco EclipseLink generuje výjimku.
Toto pravidlo prochází a hledá vložitelné třídy, které obsahují atributy s anotací Id. Pravidlo značí anotace Id v závislosti na tom, zda najde entitu, která odkazuje na vložitelnou třídu, pomocí anotace EmbeddedId.
EmbeddedId odkazuje na vložitelnou třídu, která má anotaci Id, pravidlo označí anotaci Id jako závažný problém. K odebrání anotace Id můžete použít rychlou opravu.
EmbeddedId, pravidlo označí daný problém jako varování. Vzhledem k tomu, že odkazující třída může být mimo rozsah skenování, není poskytována rychlá oprava. Rozbalením rozsahu analýzy můžete zahrnout všechny atributy anotované pomocí EmbeddedId, které by mohly odkazovat na vložitelnou třídu, a znovu spustit skenování, nebo můžete ručně ověřit, že žádné anotace EmbeddedId neodkazují na vložitelnou třídu.
V tomto příkladu pravidlo značí anotaci Id ve třídě 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; ... } |
Chcete-li vyřešit problém, rychlá oprava odebere anotaci @Id a 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; ... } |
Informace o tomto problému a jiných problémech migrace OpenJPA na EclipseLink viz příručka Migrace OpenJPA na EclipseLink JPA: Mapování.