13

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

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

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

FieldAccessRule の場合:

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

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

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

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

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

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

属性 'fieldAccessRules' で、"mapped by" 値 'group' をターゲット エンティティの >attribute に解決できません。

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

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

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

期待どおりに正確に機能しています。正常にコンパイルされ、DB が正常に作成され、定義済みの役割を持つグループをロードした後、それらは期待どおりに利用可能になります。

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

属性 'fieldAccessRules' で、"mapped by" 値 'fieldAccessRulePK.group' をターゲット エンティティの属性に解決できません。

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

4

2 に答える 2

7

あなたのコードでは、 attributeEntityManagerを解決できません。mappedByfieldAccessRulePK.group

理由

EntityManagerエンティティFieldAccessRuleは 、.FieldInjection

Java Naming Variables Rule に従って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;
}
于 2012-10-19T07:54:42.207 に答える
3

親クラスの属性を変更することで同様の問題を修正しました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;
    ...
}
于 2013-05-28T14:39:23.413 に答える