如何强制TopLink立即建立OneToMany关系?

时间:2010-12-06 17:11:42

标签: java java-ee ejb toplink

我有两个实体,PersonTeacher,与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;
}

我还有Person的DTO课程:

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有这样的代码用于插入新的Teacher和阅读Person s:

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对象时(即插入操作之后)完成后,包括两个持久性和最后的同花顺),给定教师的Person对象为空teacherList

但是,如果我关闭页面并从IDE重新启动它,则新插入的元素将显示在表中。显然,TopLink确实建立了这种关系,而不是立即建立。到底发生了什么,以及如何在插入后立即强行执行此操作?

1 个答案:

答案 0 :(得分:1)

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

也就是说,执行addTeacher()后,您的Teacher person属性指向Person。这种关系反映在数据库中,但它没有反映在已经在内存中的teacherList的{​​{1}}中。 Person从持久化上下文返回em.find()的现有实例,因此其Person是iempty。

因此,您需要在teacherList的{​​{1}}中添加Teacher