[uses a non entity] org.eclipse.persistence.exceptions.ValidationException


JPAのエンティティクラスを修正していたところ、謎のエラー(ではなかったですが)に見舞われて
小1時間ほどつぶしてしまったので、顛末を備忘として残します。

1.エラー内容(スタックトレース)

    Caused by: Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.6.1.v20150916-55dc7c3): org.eclipse.persistence.exceptions.EntityManagerSetupException
    Exception Description: Predeployment of PersistenceUnit [POfDM_Local] failed.
    Internal Exception: Exception [EclipseLink-7250] (Eclipse Persistence Services - 2.6.1.v20150916-55dc7c3): org.eclipse.persistence.exceptions.ValidationException
    Exception Description: [class xyz.monotalk.xxx.ArtistTagEchonestArtistRelation] uses a non-entity [class xyz.monotalk.xxx.FestivalArtistTag] as target entity in the relationship attribute [field festivalArtistTagId].
        at org.eclipse.persistence.exceptions.EntityManagerSetupException.predeployFailed(EntityManagerSetupException.java:231)
        ... 11 more
    Caused by: Exception [EclipseLink-7250] (Eclipse Persistence Services - 2.6.1.v20150916-55dc7c3): org.eclipse.persistence.exceptions.ValidationException
    Exception Description: [class xyz.monotalk.festivals4partypeople.models.rdb.entity.ArtistTagEchonestArtistRelation] uses a non-entity [class xyz.monotalk.xxx.FestivalArtistTag] as target entity in the relationship attribute [field festivalArtistTagId].
        at org.eclipse.persistence.exceptions.ValidationException.nonEntityTargetInRelationship(ValidationException.java:1381)
        at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.RelationshipAccessor.getReferenceDescriptor(RelationshipAccessor.java:553)
        at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.ObjectAccessor.processForeignKeyRelationship(ObjectAccessor.java:634)
        at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.ObjectAccessor.processOwningMappingKeys(ObjectAccessor.java:708)
        at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.ManyToOneAccessor.process(ManyToOneAccessor.java:123)
        at org.eclipse.persistence.internal.jpa.metadata.MetadataProject.processOwningRelationshipAccessors(MetadataProject.java:1595)
        at org.eclipse.persistence.internal.jpa.metadata.MetadataProject.processStage3(MetadataProject.java:1848)
        at org.eclipse.persistence.internal.jpa.metadata.MetadataProcessor.processORMMetadata(MetadataProcessor.java:577)
        at org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.processORMetadata(PersistenceUnitProcessor.java:604)
        at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:1948)

2.原因

persistence.xmlにEntityクラスの記述がない場合、発生します。

3.対処方法

classpath上の、persistence.xmlに対象Entityクラスを記述すれば解消されます。
メッセージ確認したところ原因は、persistence.xmlだということはわかりましたが、
何故か私のプロジェクトには、プロジェクトごとにpersistence.xmlがあり、
「対象のpersistence.xml」を直していなかった。。
という残念な形になっておりました。
根本原因はEclipseLinkの品質ではなく、作成者の品質の悪さにあります。

以上です。

コメント