0

関係のエンティティを管理することについて混乱しています。書籍PROJPA2によると、関係は手動で構成し、関係の両端に割り当てる必要があります。

ここで、この関係について考えてみましょう。

@Entity
public class Employee {
    ..
    @ManyToOne(cascade=CascadeType.PERSIST)
    private Department department;
    ..
}
@Entity
public class Department {
    ..
    @OneToMany(mappedBy="department")
    private Set<Employee> employees = new HashSet<Employee>();

    public void addEmployee(Employee e){
        getEmployees().add(e);
        e.setDepartment(this);
    }
}

これを検証するために、このコード行を含む簡単なテストケースを作成しました。

Department dept1 = new Department();
dept1.setName("MARKETING");

Employee e1 = new Employee();
e1.setName("JOHN DOE");

e1.setDepartment(dept1); //[1]
//dept1.addEmployee(e1); //[2]

行[1]を検討してください。

これでは正しい部門IDでEmployeeテーブルが適切に更新されないと思いましたが、Derbyをチェックすると、更新を適切に実行できます。

行[2]を検討してください。

これは本によると適切な方法です。

Eclipselink / Derby / JPA2

4

1 に答える 1

1

[1] 行のようにすると、Employee 'e1' は FK でデータベースに保存されますが、... Department dept1 を取得して getEmployees(); を呼び出すと、従業員「e1」はこのリストに含まれません。データベースからそのデパーメントを再度取得するために新しいクエリを作成したとしても。Employee 'e1' はありません (少なくとも、アプリケーションを再利用するまでは)。そのため、常に [2] の方法で行う必要があります。
JPA2 を使い始めたとき、私はこれを知りませんでした。[1] のようにエンティティを永続化していました。最近永続化されたエンティティが JPA によって読み取られず、実際には DB に格納された理由を特定しようとして、私はほとんど夢中になりました。

于 2012-06-01T14:04:54.030 に答える