0

JPA EclipseLink で複合主キーを使用する際に問題があります。問題は、別のテーブルの主キーである外部キーがある場合です。私はこの単純なシナリオを持っています。

ユーザー

public class Users implements Serializable {
...
private Collection<UserCompany> userCompanyCollection;
@JoinColumn(name = "user_roles", referencedColumnName = "user_role_id")
@ManyToOne(optional = false)
private UserRoles userRoles;
...
}

ユーザーの役割

public class UserRoles implements Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId
protected UserRolesPK userRolesPK;
…
}

ユーザー ロール PK

@Embeddable
public class UserRolesPK implements Serializable {
@Basic(optional = false)
@Column(name = "user_role_id")
private int userRoleId;
@Basic(optional = false)
@NotNull
@Column(name = "user_role_company_id")
private int userRoleCompanyId;
...
}

そのオブジェクトを使用すると、次の例外が発生します。

Caused by: Exception [EclipseLink-7220] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.ValidationException
Exception Description: The @JoinColumns on the annotated element [field userRoles] from the entity class [class jpa.Users] is incomplete. When the source entity class uses a composite primary key, a @JoinColumn must be specified for each join column using the @JoinColumns. Both the name and the referencedColumnName elements must be specified in each such @JoinColumn.
at org.eclipse.persistence.exceptions.ValidationException.incompleteJoinColumnsSpecified(ValidationException.java:1805)
at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.MappingAccessor.getJoinColumnsAndValidate(MappingAccessor.java:575)
at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.MappingAccessor.getJoinColumns(MappingAccessor.java:525)
at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.ObjectAccessor.processOneToOneForeignKeyRelationship(ObjectAccessor.java:629)
at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.ObjectAccessor.processOwningMappingKeys(ObjectAccessor.java:686)
at org.eclipse.persistence.internal.jpa.metadata.accessors.mappings.ManyToOneAccessor.process(ManyToOneAccessor.java:119)
at org.eclipse.persistence.internal.jpa.metadata.MetadataProject.processOwningRelationshipAccessors(MetadataProject.java:1432)
at org.eclipse.persistence.internal.jpa.metadata.MetadataProject.processStage3(MetadataProject.java:1667)
at org.eclipse.persistence.internal.jpa.metadata.MetadataProcessor.processORMMetadata(MetadataProcessor.java:521)
at org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.processORMetadata(PersistenceUnitProcessor.java:526)
at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:1320)
... 36 more
|#]

すべての助けを前もって感謝します。

よろしく、ダニエル

4

1 に答える 1

0

JPAでは、関係マッピングで完全な主キーを使用する必要があります。そのため、JPAはマッピングを好みません。つまり、user_role_company_idpkフィールドを使用していません。user_role_idがuserRolesを一意に識別するのに十分な場合は、複合キーを使用せず、代わりに単一のフィールドのみを使用する必要があります。

EclipseLinkは外部キーを非または不完全なIDフィールドにマッピングできますが、それはお勧めしません。エンティティは主キーにキャッシュされるため、エンティティが既にキャッシュにある場合でも、関係を解決するには不要なデータベースクエリが必要になる場合があります。マッピングには、カスタマイザーを使用してマッピングを作成または変更する必要があります。カスタマイザーを使用した例は、 http: //wiki.eclipse.org/EclipseLink/Examples/JPA/MappingSelectionCriteriaにあります。

于 2013-02-14T03:43:48.683 に答える