私には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を挿入してTeacher
sを読み取るための次のようなコードがあります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
によって返されるオブジェクトがfalsereadPerson
にisTeacher
設定されていることです。つまり、DTOオブジェクトが作成されたとき(つまり、挿入操作が終了した後、2つの永続化と最後のフラッシュを含む)、Person
指定された教師のオブジェクトには空がありますteacherList
。
ただし、ページを閉じてIDEから再起動すると、新しく挿入された要素がテーブルに表示されます。したがって、TopLinkは、すぐにではなく、関係を設定しているようです。正確には何が起こっているのでしょうか。挿入直後に強制的に実行するにはどうすればよいですか。