0

データベースに 2 つの 3 つのテーブルがあります。

グループ
----------
グループ ID PK
名前
ユーザーアカウント
----------
ユーザー ID PK
user_grouping
----------
groupId PK FK グループ化 (groupId -> groupId)
userId PK FK user_account(userId -> userId)

私の UserAccount エンティティには、次の行があります。

@JoinTable(name = "user_group", joinColumns = {
    @JoinColumn(name = "userId", referencedColumnName = "userId")}, inverseJoinColumns = {
    @JoinColumn(name = "groupId", referencedColumnName = "groupId")})
@ManyToMany
private List<Grouping> groupingList;

これは、すべてのテーブル間の関係を示すためです。ただし、デプロイすると、次のエラーが発生します。

SEVERE: アプリの準備中の例外: Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.EntityManagerSetupException
例外の説明: PersistenceUnit [com.dv_model_ejb_1.0-SNAPSHOTPU] の事前展開に失敗しました。
内部例外: 例外 [EclipseLink-7220] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.ValidationException
例外の説明: エンティティ クラス [クラス com.dv.model.entity.UserAccount] の注釈付き要素 [フィ​​ールド groupingList] の @JoinColumns が不完全です。ソース エンティティ クラスが複合主キーを使用する場合、@JoinColumns を使用して結合列ごとに @JoinColumn を指定する必要があります。このような @JoinColumn ごとに、name 要素と referencedColumnName 要素の両方を指定する必要があります。
ローカル例外スタック:
例外 [EclipseLink-28018] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.EntityManagerSetupException
例外の説明: PersistenceUnit [com.dv_model_ejb_1.0-SNAPSHOTPU] の事前展開に失敗しました。
内部例外: 例外 [EclipseLink-7220] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.ValidationException
例外の説明: エンティティ クラス [クラス com.dv.model.entity.UserAccount] の注釈付き要素 [フィ​​ールド groupingList] の @JoinColumns が不完全です。ソース エンティティ クラスが複合主キーを使用する場合、@JoinColumns を使用して結合列ごとに @JoinColumn を指定する必要があります。このような @JoinColumn ごとに、name 要素と referencedColumnName 要素の両方を指定する必要があります。
    org.eclipse.persistence.exceptions.EntityManagerSetupException.predeployFailed (EntityManagerSetupException.java:221) で
    org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:1402)で
...

このエラー メッセージを正確に解釈する方法がわかりません。エンティティでテーブル リレーションシップが正しくモデル化されていないと想定しています。しかし、理由はわかりません。今日まで、これは正常にコンパイルされていました。誰でも支援を提供できますか?

4

1 に答える 1

0

テーブルの説明に一貫性がなく (グループ化とグループ化)、エンティティ マッピングの結合テーブルの名前がテーブル名の 1 つではありません。これらの不一致のため、次のテーブル構造を想定しています。

useraccount (userid PK)
grouping (groupdid PK, name)
user_grouping (userId PK, groupId PK)
- FK userId references to user_account.userid
- FK groupId references to grouping.groupId

これを 2 つのエンティティにマップする 1 つの正しい方法は次のとおりです。

@Entity
public class UserAccount {
    @Id int userId;

    @JoinTable(name = "user_grouping", joinColumns = {
       @JoinColumn(name = "userId", referencedColumnName = "userId")},
       inverseJoinColumns = {
       @JoinColumn(name = "groupId", referencedColumnName = "groupId")})
       @ManyToMany
       private List<Grouping> groupingList;
    //get and set omitted.
}

@Entity
public class Grouping {
    @Id int groupId;
    String name;
    //get,set, and optional inverse side of relationship omitted
}
于 2012-06-14T18:48:26.527 に答える