53

名前の 1 つは User で、このユーザーには他のクラス インスタンスがあります。このような;

public class User{
    @OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL)
    public List<APost> aPosts;

    @OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL)
    public List<BPost> bPosts;
}




   public class BPost extends Post {
    
    @ManyToOne(fetch=FetchType.LAZY)    
    public User user;
 }
    
    public class APost extends Post {
    
     @ManyToOne(fetch=FetchType.LAZY) 
     public User user;
 }

このように機能していますが、DB に空のテーブルが生成されます。外部キーを含める必要があります。アノテーションを使用しようとするmappedByと失敗しました。JoinColumnどうすればこれを解決できますか?

追加情報:

と着替えた時は・・・

 @ManyToOne(fetch=FetchType.LAZY)
 @JoinColumn(name="id")
 public User user;

 @OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="id")
 public List<APost> aPosts;

私は得ています

JPA エラーが発生しました (EntityManagerFactory を構築できません): エンティティのマッピングで列が繰り返されました: models.post.APost 列: id (insert="false" update="false" でマップする必要があります)

最終編集:最後に、JPA アノテーションについて完全に間違っていました。:(私が変わるとき

@OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="id")

@OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="user")

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="user_id")

すべて正常に動作します。:)

4

2 に答える 2

66

あなたの質問(「空のテーブル」の意味など、またはどのように機能mappedByしてJoinColumnいなかったのか)についてはよくわかりません。

あなたは双方向の関係を作ろうとしていたと思います。

まず、どちらの側が関係を「所有」するかを決定する必要があります。Hibernateはその側にリレーションシップベースをセットアップします。たとえば、私がPost側に関係を所有させると仮定すると(私はあなたの例を単純化して、物事を適切に保つために)、マッピングは次のようになります。

(構文が正しいことを望みます。私はそれらをメモリだけで書いています。しかし、アイデアはうまくいくはずです)

public class User{
    @OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="user")
    private List<Post> posts;
}


public class Post {
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="user_id")
    private User user;
}

そうすることで、のテーブルには関係を格納Postする列ができます。user_idHibernateはinによって関係を取得していuserますPost(inの代わりpostsに。'sがあるが' sがないUser場合は違いに気付くでしょう)。PostuserUserposts

あなたは言及mappedByしましたが、機能しJoinColumnていません。しかし、これは実際には正しい方法だと思います。このアプローチがうまくいかないかどうかを教えてください。問題についてもう少し詳しく教えてください。問題は他の原因によるものだと思います。


編集:

mappedBy最初は通常混乱するので、使用に関する少し余分な情報。ではmappedBy、テーブルの列名ではなく、双方向の関係の反対側に「プロパティ名」を配置します。

于 2012-12-11T01:08:12.820 に答える