2015-10-15 6 views
5

私の現在の実装では、各dbテーブルに対して別々のエンティティクラスがあります。私はeclipselink-2.5.2と一緒にJPAを使用しています。これは私のためにうまくいきますが、データが巨大であるときには遅れます。だから私は@Embedded、@ Embeddableと@EmbeddedIdの使用を開始することに決めました。これをしている間、私は非常に奇妙なエラーを受けています。ここに完全なスタックトレースが掲載されています:https://gist.githubusercontent.com/tjDudhatra/b955812e0d1a71cf97f1/raw/11ea458869e24baae744530417ac99bc877ed514/gistfile1.txtEclipseLink-2.5.2でEmbeddableクラスのIDタイプを設定する際に奇妙な問題が発生しました

具体的には、私はあなたに例外が発生している場合の正確なシナリオを教えてください。 3つのクラスを持つこのCodeブロックを考えてみましょう。 1つは@Entityとして注釈され、他の2つは@Embeddableとしてアノテートされます。 私は1つのクラスで私たちは@Idと@EmbeddedIdを定義することはできませんし、私は、あまりにも、サーバーを展開しながら、私は言う例外を取得しています、そのように行っていないことを知っている:

[クラスorg.apache

{工ass}] @EmbdeddedId(属性 の[ID])と@Id(属性の[]。両方IDタイプが同じエンティティで を指定することができないの両方を有する。

@Entity 
@Table(name="user") 
public class User { 

    @ID 
    public Long id; 

    @Column(name="userCode") 
    public String userCode; 

    @ElementCollection 
    @CollectionTable(name = "address", joinColumns = @JoinColumn(name = "user_id")) 
    public List<Address> addressList; 

    .... 
} 

@Embeddable 
public class Address { 

    @EmbeddedId 
    @Column(name = "id") 
    public Long id; 

    @Column(name="userId") 
    public Long userId; 

    @Column(name="address-line-1") 
    public String addressLine1; 

    @Column(name="address-line-2") 
    public String addressLine2; 

    @ElementCollection 
    @CollectionTable(name = "phone", joinColumns = @JoinColumn(name = "user_id")) 
    protected List<Phone> phoneList; 

    .... 
} 

@Embeddable 
public class Phone { 

    @EmbeddedId 
    @Column(name = "id") 
    public Long id; 

    @Column(name="contact_no") 
    public String contactNo; 

    @Column(name="country_code") 
    public int countryCode; 

    @Column(name="address_id") 
    public int addressId; 

    .... 
} 

くださいより多くの詳細が必要であればどんな種類の助けでも大いに感謝されますように教えてください。

おかげで、

+0

おお、私は謝罪、それはあなたの応答のためのEclipseLink-2.5.2 –

答えて

3

ここで私はこの問題を発見しました。私はいくつかの分析を行い、embeddableとelementCollectionの詳細を知りました。ここに参照があります:

私はそれに応じてコードを修正しました。これは私がそれを働かせた方法です。

@Entity 
@Table(name="user") 
public class User { 

    @ID 
    public Long id; 

    @Column(name="userCode") 
    public String userCode; 

    @OneToMany(fetch = FetchType.EAGER) 
    @JoinColumn(name = "user_id") 
    public List<Address> addressList; 

    .... 
} 

@Entity 
@Table(name="address") 
public class Address { 

    @Id 
    @Column(name = "id") 
    public Long id; 

    @Column(name="userId") 
    public Long userId; 

    @Column(name="address-line-1") 
    public String addressLine1; 

    @Column(name="address-line-2") 
    public String addressLine2; 

    @OneToMany(fetch = FetchType.EAGER) 
    @JoinColumn(name = "address_id") 
    protected List<Phone> phoneList; 

    .... 
} 

@Entity 
@Table(name="phone") 
public class Phone { 

    @Id 
    @Column(name = "id") 
    public Long id; 

    @Column(name="contact_no") 
    public String contactNo; 

    @Column(name="country_code") 
    public int countryCode; 

    @Column(name="address_id") 
    public int addressId; 

    .... 
} 
3

@Embeddableはどんな@EmbeddedIdを含んではならない注釈付きクラス。

@EmbeddedId他のクラスのクラス@Embeddableクラスのフィールドに注釈を付け、主キーとしてマークすることです。

例:

@Entity 
public class Project { 
    @EmbeddedId ProjectId id; 
    ... 
} 

@Embeddable 
Class ProjectId { 
    int departmentId; 
    long projectId; 
    ... 
} 

EDIT:あなたのケースでは、私はあなたがPhoneをしたいとは思わない、またAddress@Embeddableします。それらを通常の@Entityとマークするだけです。

+0

おかげだけど、あなたは私がatEmbeddableで電話とアドレスクラスにアノテーションを付けない場合は、それが動作することを詳しく説明できますか? 私は、あるクラスのコレクションを埋め込みたいのであれば、そのクラスにはatEmbeddableとして注釈を付ける必要があります。 私が間違っている場合は私を修正してください。 –

+2

いいえ、 '@ Embeddable'は本当にキーとして動作するクラスです。データベーススキーマは修正されていますか?その場合は、ユーザー、住所、およびそれらの間のリンク用のテーブルを用意してください。 –

+1

私は今、その概念を明確にしました、ありがとう.. –

関連する問題