0

我有两个实体,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 有这样的代码,用于插入 newTeacher和读取Persons:

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返回的对象readPerson已经isTeacher设置为false:这意味着在创建DTO对象时(即插入操作完成后,包括最后的两个persistes和flush),Person给定教师的对象为空teacherList

但是,如果我关闭页面并从 IDE 重新启动它,新插入的元素会显示在表格中。显然,TopLink 确实建立了这种关系,只是没有立即建立。到底发生了什么,我怎样才能强制它在插入后立即执行?

4

1 回答 1

1

JPA 不会自动在内存中的对象之间保持一致的双向关系,这是您自己的任务。

也就是说,执行后addTeacher()你有Teacher一个person指向Person. 这种关系反映在数据库中,但不反映在内存中teacherList。从持久化上下文返回现有的实例,所以它是空的。Personem.find()PersonteacherList

因此,您需要在 in 中添加一个Teacherinto 。Person.teacherListaddTeacher()

于 2010-12-06T17:26:49.827 回答