2017-04-22 17 views
0

私は@EntityとRecipe.javaオブジェクトがあります。休止状態 "の重複エントリー '1' キーのために 'をUK_2n5xttsxwbyc6x67l0x8phfwn'"

... 
@OneToMany(cascade = CascadeType.ALL) 
private List<Category> category; 
... 

その後@EntityとCategory.javaオブジェクト:

... 
@OneToOne(cascade = CascadeType.ALL) 
private Name name; 
... 

のは、DBは、この(recipe_category表)のように見えることを言ってみましょう:

enter image description here

その後、次のコードが実行される(私はレシピにカテゴリを追加したい):

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '1' for key 'UK_2n5xttsxwbyc6x67l0x8phfwn' 

は、だから何が解決策になる:私は次のエラーを取得していますrecipeRepository.save(recipe)

... 
     Recipe recipe = recipeRepository.findOne(recipeId); 
     Category ctg = categoryRepository.findOne(categoryId); // id=1 

     List<Category> categories = recipe.getCategory(); 
     categories.add(ctg); 
     recipe.setCategory(categories); 

     recipeRepository.save(recipe); 
... 

この問題のために?

UPDATE:
レシピテーブル構造は次のようになります。

enter image description here

カテゴリテーブルの構造は次のようになります。

enter image description here

だから、問題はときので起こるようですrecipe.setCategory(categories);がトリガーされ、ctgをdbに保存しようとしましたが、すでに存在しています。私が望むのはdbに保存するのではなく(すでに 'カテゴリ'テーブルにあるため)、recipe_categoryテーブルに新しい行を追加することです。

多分、カスケードで何かする必要がありますか?

+0

私はそれが原因@OneToManyの誤用にだと思う、この答えは役に立つかもしれ:http://stackoverflow.com/a/ 15802642/7624937 – LLL

+0

テーブルをどのように作成しますか?あなたはテーブル構造、作成スクリプト、または少なくとも例外の中で言及されているキーの定義を投稿できますか? – infiniteRefactor

+0

@infiniteRefactor私はテーブルの構造に関するいくつかの詳細を質問に更新しました。だから問題は「創造」プロセスではなく、レシピに既存のカテゴリを追加したいときです。 – Cristian

答えて

1

あなたの関係は1対多ではありません。各レシピに複数のカテゴリが必要です。私はあなたも各カテゴリーを複数のレシピに関連づけたいと思う。これは多対多の関係です。エンティティを設定するには、@ManyToMany注釈を使用する必要があります。

はまた、Hibernateの関係は常に単方向であることに注意してください。 @ManyToManyアノテーションをRecipeクラスに入れると、指定されたレシピに関連付けられたカテゴリにアクセスできます。逆の関係にアクセスするには、特定のカテゴリのレシピを取得するには、@ManyToManyアノテーションを持つ適切なプロパティをCategoryクラスにも追加する必要があります。

は、私はあなたがhbm2ddlを使用したり、自動と類似の方法は、あなたのテーブルを作成推測し、テーブルが1対多の関係のために作成されているので、エラーが発生します。より具体的には、一方向の1対多の関係では、結合表の逆外部キー列(recipe_category表内のcategory_id)に一意制約が定義されています。したがって、そのテーブルスキーマでは、カテゴリを複数のレシピに関連付けることはできません。

このような何かが動作するはずです:

// Recipe 
@ManyToMany(cascade=CascadeType.ALL) 
@JoinTable(name="category_map",) 
private List<Category> categories = new ArrayList<>(); 

// Category 
@ManyToMany(cascade=CascadeType.ALL, mappedBy="categories")  
private Set<Recipe> recipes;  
+0

あなたのソリューションと説明に感謝します。できます。 – Cristian