2016-05-02 11 views
0

がスローされます(オファークラス)Hibernateは永続化の設定私のクラスはこれにsimiar見例外

@Entity 
public class Offer { 
    @Id 
    @GeneratedValue(strategy = GenerationType.TABLE) 
    private int id; 
    @ElementCollection(fetch = FetchType.LAZY) 
    private Set<Product> products; 

    ...other fields 
} 

とProductクラス:

@Embeddable 
public class Product { 
    private String name; 
    private String description; 
    private int amount; 
} 

私が持続しようとすると問題がありますオファーエンティティとセットのを提供するために2つのオブジェクトを追加しよう:

Product product = new Product("ham", "description1", 1); 
Product product = new Product("cheese", "description2", 1); 

私は例外を受け取る:

Caused by: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "offer_products_pkey" 
    Details: Key (offer_id, amount)=(1, 1) already exists. 

「amount」フィールドの値が同じでも、2つの埋め込みオブジェクトをセットに残すことはできません。それは何とかIDとして扱われますか?

埋め込み可能なオブジェクトのリストは、このように使用するように設計されていないため作成しないでください。もしそうなら、私は製品のエンティティは必要としませんが、別のエンティティ(オファー)にそのセットを保持したいのですが?問題Setを使用して、ヘルプ

+1

テーブル製品で誤ったキーを定義している可能性があります。例外はクリアです – mariusz2108

+0

Productオブジェクトにキー変数はありません。 Setの代わりにListを使用すると、正常に動作しますが、Setに対しては機能しません。問題は、Setインターフェイスの機能に縛られているようです。重複を含むことはできません。しかし、なぜフィールド "金額"は重複として扱われますか? – azalut

+0

このエラーはPostgreSQLが原因です。何が間違っているかを示します。(offer_id、amount)に対してoffer_products_pkeyという名前の主キーのように定義しました。同じ主キーを持つ2つの行を挿入しようとしています。そのプライマリキー制約が存在しない場合は削除します。 –

答えて

0

を事前に

おかげでそれがSetの定義であるため、内容は、一意でなければならないということです。 JPAプロバイダはこれをデータベース制約で強制しようとします。あなたの例では、Offer_idAmountという形の制約をPrimary Keyという形で追加していますが、IMHOでは、すべての値に対してProductプロパティの制約を追加する必要があります。代わりにSetOfferListproducts財産を作るために

Hibernate: create table Offer (id integer not null, primary key (id)) 
Hibernate: create table Offer_products (Offer_id integer not null, amount integer not null, description varchar(255), name varchar(255), primary key (Offer_id, amount)) 
Hibernate: alter table Offer_products add constraint FKmveai2l6gf4n38tuhcddby3tv foreign key (Offer_id) references Offer 

これを修正する方法である:これを見るための最良の方法は、SQLのログを有効にして、カバーの下に何が起こっているかを確認することです

Hibernate: create table Offer (id integer not null, primary key (id)) 
Hibernate: create table Offer_products (Offer_id integer not null, amount integer not null, description varchar(255), name varchar(255)) 
Hibernate: alter table Offer_products add constraint FKmveai2l6gf4n38tuhcddby3tv foreign key (Offer_id) references Offer 
関連する問題