現在、複合主キークラスを使用するシナリオの適切なマッピングアノテーションに苦労しています。まず、私が言葉で達成しようとしていること:
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ではサポートされていないという投稿を見つけました。 )
コードでは、EntityManager
はmappedBy
属性fieldAccessRulePK.group
を解決できません。
理由
EntityManager
FieldAccessRule
エンティティには、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;
}
親クラスの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;
...
}