В соответствии со спецификацией Java Persistence API (JPA) встраиваемый класс
не может содержат атрибут с аннотацией Id, если сущность
определяет атрибут с аннотацией EmbeddedId. Если задана и
аннотация EmbeddedId, и аннотация Id, то OpenJPA
игнорирует аннотацию Id, а EclipseLink генерирует исключительную ситуацию.
Это правило находит классы Embeddable, содержащие атрибуты с
аннотацией Id, и отмечает аннотации Id при наличии
сущности, которая ссылается на встраиваемый класс, используя аннотацию
EmbeddedId.
EmbeddedId ссылается на встраиваемый класс, имеющий
аннотацию Id, то правило отмечает аннотацию Id как серьезную неполадку. Используя процедуру быстрого исправления, можно удалить аннотацию
Id.
EmbeddedId, не найдена, правило отмечает эту проблему как предупреждение. Расширьте область
действия анализа, включив в нее все атрибуты с аннотацией
EmbeddedId, которые могут ссылаться на встраиваемый класс, и
повторите проверку, либо вручную убедитесь в том, что ни одна аннотация
EmbeddedId не ссылается на встраиваемый класс.
В следующем примере правило отметит аннотацию Id в классе 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; ... } |
Для устранения неполадки процедура быстрого исправления удалит аннотацию @Id и соответствующие операторы 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; ... } |
Для получения дополнительной информации об этой проблеме и других проблемах, возникающих при миграции OpenJPA в EclipseLink, обратитесь к руководству Миграция OpenJPA в EclipseLink JPA: преобразования.