14

複合キーを持つエンティティがあるため、@Embeddable および @EmbeddedId アノテーションを使用します。埋め込み可能なクラスは次のようになります。

@Embeddable
public class DitaAdminAccountSkillPK implements Serializable {

  @ManyToOne
  @JoinColumn(name = "admin_id")
  private DitaAdmin admin;

  @ManyToOne
  @JoinColumn(name = "account_id")
  private DitaAccount account;

  //constructor, getters, setters...
}

そして、それを使用するエンティティ:

@Entity
public class DitaAdminAccountSkill {

  @EmbeddedId
  private DitaAdminAccountSkillPK id;

  //constructor, getters, setters...
}

今、私はこのような別のエンティティでエンティティをマップしたい:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "id.admin")
private List<DitaAdminAccountSkill> accountSkills;

DitaAdminAccountSkill のidフィールドを使用して、 DitaAdminAccountSkillPKのadminフィールドを参照するmappingBy = "id.admin"に注意してください

これは問題なくコンパイルされ、実行されます。ただし、Eclipse では次のようなエラーが表示され ます。

これは、JPA ファセットが不平を言っていることを意味するJPA 問題であることに注意してください。今、代わりに @IdClass を使用できることはわかっていますが、なぜそれがエラーだと思うのでしょうか。それとも、私はひどく間違ったことをしていますか?

4

5 に答える 5

25

JPA 2.0 仕様のセクション 11.1.15 によると、組み込み ID クラス内で定義された関係マッピングはサポートされていません。ただし、これ、標準自体で公式にサポートされていなくても、使用している JPA 実装でサポートされている場合があります。

この場合は、Eclipse での検証をオフにすることをお勧めしますWindow -> Preferences -> Java Persistence -> JPA -> Errors/Warnings -> Attributes -> Cannot resolve attribute name

于 2012-08-24T11:34:15.313 に答える
7

私の場合、以下を に設定するまで問題は解決しませんでしたIgnore:

Project Facets > JPA > Errors/Warnings > Type > Mapped Java Class is a member class
于 2014-10-24T02:15:04.210 に答える
4

JPA 2.0仕様に準拠し、同じように機能するように見える、私が見つけたソリューションを投稿すると思いました。

まず、JPA 2.0 仕様は、JSR-000317 Persistence Specification for Eval 2.0 Eval にあります。関連するセクションは、2.4.1「派生アイデンティティに対応する主キー」です。

指定したクラスを使用した例を次に示します。

埋め込み ID クラス:

@Embeddable
public class DitaAdminAccountSkillPK implements Serializable {

    //No further annotations are needed for the properties in the embedded Id.

    //Needs to match the type of the id of your DitaAdmin object. I added 'Id' to the end of the property name to be more explicit.
    //Making the assumption here that DitaAdmin has a simple Integer primary key.
    private Integer adminId;

    //Needs to match the type of the id of your DitaAccount object. I added 'Id' to the end of the property name to be more explicit.
    //Making the assumption here that DitaAccount has a simple Integer primary key.
    private Integer accountId;


    //I'm adding a third property to the primary key as an example
    private String accountName;

    //constructor, getters, setters...

    //hashCode() and equals() overrides
}

「依存」エンティティ クラス:

@Entity
public class DitaAdminAccountSkill {

    @EmbeddedId
    //Any overrides to simple Id properties should be handled with an attribute override
    @AttributeOverride(name = "accountName", column = @Column(name = "account_name"))
    private DitaAdminAccountSkillPK id;

    //MapsId refers to the name of the property in the embedded Id
    @MapsId("adminId")
    @JoinColumn(name="admin_id")
    @ManyToOne
    private DitaAdmin admin;

    @MapsId("accountId")
    @JoinColumn(name="account_id")
    @ManyToOne
    private DitaAccount account;

    //constructor, getters, setters...
}

「親」エンティティ クラス:

public class DitaAdmin {

    @Id
    private Integer id;

    //...

    //Now your mappedBy attribute can refer to the admin object defined on DitaAdminAccountSkill which is also part of the Primary Key
    @OneToMany(fetch = FetchType.LAZY, mappedBy="admin")
    private List<DitaAdminAccountSkill> accountSkills;

    //...
}
于 2013-01-22T21:22:29.690 に答える
1

Preferences -> Java Persistence -> JPA -> Errors/Warnings -> Attribute -> Embedded ID クラスには関係マッピングを含めないでください: (無視)

于 2015-09-25T14:21:01.017 に答える