Hibernate との関係のマッピング
質問
JPA アノテーションを使用してこれらのマッピングを設定する方法をまだ学んでいるので、これは初歩的な間違いである可能性があります。
User クラスと Course クラスがあります。データベースでは、各コースの各行にユーザー外部キーがあります (ユーザーはコースを教える教師であると考えてください)。したがって、各ユーザーは複数のコースを持つことができますが、各コースには 1 人のユーザーのみが含まれます。
これらのクラスをマッピングする際に、以下のコードを作成しました。
@Entity
public class User extends BaseModel {
@OneToMany(mappedBy="course")
private Collection<Course> courses;
public void setCourses(Collection<Course> courses) { this.courses = courses; }
public Collection<Course> getCourses() { return courses; }
}
@Entity
public class Course extends BaseModel {
@ManyToOne
@JoinColumn(name="user_id")
private User user;
public void setUser(User user) { this.user = user; }
public User getUser() { return user; }
}
無関係なフィールドは省略し、BaseModel は各テーブルの主キーのみを説明します。 ここで明らかに間違っている点はありますか? そうでない場合、このような問題をデバッグするにはどのような方法が良いでしょうか。
ユーザー テーブルで選択を呼び出そうとすると、NullPointerException が発生します。ただし、User クラスの Course クラスへの参照を取り出すと、すべてが完全に正常に動作します。
問題の行は私のDAOクラスにあります。おそらく、エンティティ マネージャーが初期化に失敗している可能性があります。コードは次のとおりです。
Query query = Stripersist.getEntityManager().createQuery(getQuery(fieldName, null)).setParameter(fieldName, value);
createQuery() は以下を返すだけです:
String query = "FROM " + entityClass.getName() + " t WHERE t." + fieldName + " = :" + fieldName;
何が問題なのかについてのさらなる手がかりがあれば、私は Stripes フレームワーク、Hibernate、および Stripersist を使用しています。
解決
非常に一目見ただけで、それはあなたが書くべきことのようです。
@OneToMany(mappedBy="user")
private Collection<Course> courses;
I。電子。 @OneToManyに mappedBy のフィールドを指している必要があり、現在のオブジェクトを指します。
他のヒント
mappedByこの側面内のエンティティの関係の逆であり、そして「その他」エンティティに所有者が存在することを示しています。あなたのケースでは、答えaxtavtようである必要があります:
@OneToMany(mappedBy="user")
private Collection<Course> courses;
ユーザーが多くのコースを選ぶことができますし、コースはこの関係の所有権を持っていることを述べている。