web-dev-qa-db-ja.com

複合PrimaryKeyを使用したJPA / HibernateOneToManyマッピング

現在、複合主キークラスを使用するシナリオの適切なマッピングアノテーションに苦労しています。まず、私が言葉で達成しようとしていること:

GroupとFieldAccessRuleの2つのクラスがあります。グループには多くのFieldAccessRuleを含めることができますが、FieldAccessRuleには1つのグループしか割り当てられません。これを変更することは今のところ問題ではありません(簡略化):

public class Group{
    ...
    @OneToMany(mappedBy = "group")
    private Set<FieldAccessRule> fieldAccessRules;
    ... 
}

およびFieldAccessRuleの場合:

public class FieldAccessRule {
    ...
    @ManyToOne
    @JoinColumn(name = "group_id")
    private Group group;
    ...
}

ここで、FieldAccessRuleにComposite PKを使用することにしました。これは、ルールが1つのグループと1つのフィールドに対して一意である必要があるためです。次のようになります。

@Embeddable
public class FieldAccessRulePK implements Serializable{
    private String fieldKey;
    private Group group;
    ...
}

そして、ofc。 FieldAccessRuleをに変更する必要があります

public class FieldAccessRule {
    ...
    @EmbeddedId
    private FieldAccessRulePK fieldAccessRulePK;
    ...
}

グループのFieldAccessRuleSetに適切なマッピングを今すぐ作成するにはどうすればよいですか?このようにすると、次のようになります。

属性「fieldAccessRules」では、「マップされた」値「グループ」をターゲットエンティティの属性に解決できません。

GroupからPrimaryKeyの一部へのマッピングを作成する正しい方法は何ですか?

編集:私は知っている、それを使用して

public class Group{
    ...
    @OneToMany(mappedBy = "fieldAccessRolePK.group")
    private Set<FieldAccessRule> fieldAccessRules;
    ... 
}

期待どおりに正確に機能しています。正常にコンパイルされ、DBが正常に作成され、事前定義されたロールを持つグループをロードした後、期待どおりに使用可能になります。

しかし、Eclipseはまだ言います

属性「fieldAccessRules」では、「マップされた」値「fieldAccessRulePK.group」をターゲットエンティティの属性に解決できません。

エラーを無視してすべてが正常であると「想定」するのが良いかどうかはわかりません...(パターンattr1.attr2のマッピングはHibernateでサポートされていますが、JPA-confirmではサポートされていないという投稿を見つけました。 )

12
dognose

コードでは、EntityManagermappedBy属性fieldAccessRulePK.groupを解決できません。

理由

EntityManagerFieldAccessRuleエンティティには、FieldInjection中にfieldAccessRulePK.groupの属性名があると想定します。

Javaネーミング変数ルールによると、文字ドット> 'を使用してfieldAccessRulePK.groupに名前を付けることはできません。

Javaネーミング変数ルール参照

すべての変数名は、アルファベット、アンダースコア(_)、またはドル記号($)で始まる必要があります。残りの文字は、前述の文字に0〜9の数字を加えたもののいずれかです。慣例では、常にアルファベットの文字を使用します。ドル記号とアンダースコアは推奨されません。

もう一つ:

group埋め込み可能クラスでFieldAccessRulePKインスタンスを使用しないでください。詳細については ここ

以下のようにしてみてください:

@Embeddable
public class FieldAccessRulePK implements Serializable{
    @Column(name = "FIELD_KEY")
    private String fieldKey;
    @Column(name = "GROUP_ID")
    private String groupId;
}

public class FieldAccessRule {
    @EmbeddedId
    private FieldAccessRulePK id;

    @ManyToOne
    @JoinColumn(name = "GROUP_ID", referencedColumnName = "ID")
    private Group group;
}


public class Group{
    @OneToMany(mappedBy = "group")
    private Set<FieldAccessRule> fieldAccessRules;
}
7
Zaw Than oo

親クラスのmappedBy属性を変更することで同様の問題を修正しました(ドット表記を使用)

public class Group{
    ...
    @OneToMany(mappedBy = "fieldAccessRulePK.group")
    private Set<FieldAccessRule> fieldAccessRules;
    ... 
}

注釈をPKクラスに保持することによって:

@Embeddable
public class FieldAccessRulePK implements Serializable{
    private String fieldKey;

    @ManyToOne
    @JoinColumn(name = "group_id")
    private Group group;
    ...
}
3
Baldrick