0

私には2つのエンティティがPersonありTeacher、OneToManyの関係があります。

public class Person implements Serializable {
    @Id
    @Column(nullable = false)
    private String login;
    @OneToMany(mappedBy = "person")
    private List<Teacher> teacherList;
}

public class Teacher implements Serializable {
    @ManyToOne
    @JoinColumn(name = "LOGIN")
    private Person person;
}

次のDTOクラスもありますPerson

public class PersonDTO extends Person {
    private boolean isTeacher;

    public PersonDTO(Person p) {
        setLogin(p.getLogin());
        isTeacher = getTeacherList().size() > 0;
    }

    public boolean isTeacher() {
        return isTeacher;
    }
}

私のEJBには、新しいsを挿入してTeachersを読み取るための次のようなコードがありますPerson

public void addTeacher(String login, String password, String name,
                       String dept, String title) {
    p = new Person(true, false, login, name, password);
    persistEntity(p);
    Teacher t = new Teacher(dept, p, title);
    persistEntity(t);
    em.flush();    // 'em' is the Entity Manager
}

public PersonDTO readPerson(String login) {
    Person p = em.find(Person.class, login);
    PersonDTO pdto = new PersonDTO(p);
    return pdto;
}

私のウェブページには、すべての教師を表示するテーブル、さまざまなフィールドのテキストボックス、新しい教師を追加してテーブルを更新するためのボタンがあります。リスナーは次のようになります。

public void addTeacherListener(ActionEvent actionEvent) {
    adminManager.addTeacher(/* parameters */);

    // update table (which is bound to 'teacherList')
    teacherList = new LinkedList<Teacher>();
    List<String> logins = adminManager.findAllPerson();
    for (String login : logins) {
        PersonDTO pdto = adminManager.readPerson(login);
        if (pdto.isTeacher()) {
          teacherList.add(pdto.getTeacherList().get(0));
        }
    }
}

問題は、新しい教師を挿入した後、それがテーブルに表示されないことです。これの正確な理由は、PersonDTOによって返されるオブジェクトがfalsereadPersonisTeacher設定されていることです。つまり、DTOオブジェクトが作成されたとき(つまり、挿入操作が終了した後、2つの永続化と最後のフラッシュを含む)、Person指定された教師のオブジェクトには空がありますteacherList

ただし、ページを閉じてIDEから再起動すると、新しく挿入された要素がテーブルに表示されます。したがって、TopLinkは、すぐにではなく、関係を設定しているようです。正確には何が起こっているのでしょうか。挿入直後に強制的に実行するにはどうすればよいですか。

4

1 に答える 1

1

JPAは、メモリ内のオブジェクト間の一貫した双方向の関係を自動的に維持しません。これは独自のタスクです。

つまり、実行後addTeacher()、を指すTeacherwithプロパティがあります。この関係はデータベースに反映されますが、すでにメモリにあるものには反映されません。の既存のインスタンスを永続コンテキストから返すため、空になります。personPersonteacherListPersonem.find()PersonteacherList

したがって、にを追加Teacherする必要があります。Person.teacherListaddTeacher()

于 2010-12-06T17:26:49.827 に答える