2016-10-26 5 views
0

...JPA、OneToMany関係に苦しんで私は2つのMySQLのテーブル、最初のを持っている

料理

  • ID(int型)
  • USER_ID(int型)
  • recipe_id(int型)
  • のcreated_at(日時)

レシピ

  • ID(int型)
  • タイトル(varchar型)
  • などなど

料理のテーブルの目的は、ユーザーが自分の料理に追加したレシピを追跡することです。

私はCookBook JPAエンティティを作成しましたが、各レシピを各料理の行にプルしようとしています。

@Entity 
@Table(name="cookbook") 
public class CookBook { 

    @Id 
    @GeneratedValue 
    private int id; 

    @Column(name="user_id") 
    private int userId; 

    @OneToMany(cascade=CascadeType.ALL) 
    @JoinColumn(name = "recipe_id", referencedColumnName = "id") 
    private List<Recipe> recipes; 

    @Column(name="created_at", columnDefinition = "DATETIME") 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date createdAt; 

    /* Getters and setters */ 
} 

問題は、私が試してみていることに関係なく、エラーが発生し続けることです。上記で私は得る;

Unknown column 'recipes0_.recipe_id' in 'field list' 

もちろん、レシピテーブルにはそのフィールドが含まれていないため正しいです。だから私はCookBookの関係を変更する。

@OneToMany(cascade=CascadeType.ALL) 
@JoinColumn(name = "id", referencedColumnName = "recipe_id") 
private List<Recipe> recipes; 

これを実行すると、私のSpring起動アプリケーションは実行されません。エラーが表示されます。

Unable to find column with logical name: recipe_id in org.hibernate.mapping.Table(cookbook) and its related supertables and secondary tables 

誰かが私が間違っていることを示すことができますか?

これが役に立ちましたら、私はこのような最終的なSQLを見ていきます。

SELECT * FROM cookbook INNER JOIN recipe ON cookbook.recipe_id = recipe.id 
+1

「referencedColumnName」で何をしようとしていますか?あなたはFukをCookBookに保存する "id"という関連クラス(Recipe)に列があると指定しました...? CookBookに「recipe_id」がある場合、その関係はCookBookの1-Nではありません。 "cookbook_id"が1-Nであるためには、 "recipbook_id"がレシピに含まれているか、1-Nフィールドがレシピに入れられている必要があります。 –

+0

私がやっていることは、cookbook.recipe_idとrecipe.idの間のリンクを作ることです。私ができるようにしたいのは、データベース上のクエリを実行して特定のユーザーIDを持つすべてのcookbook行を返し、リンクされているレシピを結果に埋め込むことです。レシピエンティティにcookbook_idを入れないでこれを行う方法はありますか?それは、レシピが複数の料理ブックに属することができるので、私に間違っていると感じるだけです。 – SheppardDigital

+1

Cookbookのrecipe_id(CookbookからRecipeまでのFK)がある場合、CookBookのフィールドは「Recipe recipe」(N-1または1-1)としてください。 –

答えて

0

この問題の他の人は、上記のコメントは正しい、私はそれを間違っていた。

最後に私はユーザーエンティティに関係を置くことで問題を解決しました。これを使用して各ユーザーの料理レシピにアクセスできます。

user.getCookBookRecipes(); 

ここで、私のUserエンティティ内で使用した関係があります。

/* Cookbook */ 
@ManyToMany 
@JoinTable(
    name="cookbook", 
    [email protected](name="user_id", referencedColumnName="id"), 
    [email protected](name="recipe_id", referencedColumnName="id")) 
@JsonIgnore 
private List<Recipe> cookbookRecipes; 
関連する問題