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

标签 java jakarta-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 :

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));
        }
    }
}

问题是插入新教师后,它没有显示在表中。确切的原因是 readPerson 返回的 PersonDTO 对象的 isTeacher 设置为 false:这意味着此时 DTO 对象是创建后(即插入操作完成后,包括两次持久化和最后的刷新),给定教师的 Person 对象有一个空的 teacherList

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

最佳答案

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

也就是说,执行 addTeacher() 后,您将拥有一个 Teacher,其 person 属性指向 Person 。此关系反射(reflect)在数据库中,但未反射(reflect)在内存中已存在的 PersonteacherList 中。 em.find() 从持久化上下文中返回 Person 的现有实例,因此它的 teacherList 为空。

因此,您需要在 addTeacher() 中将 Teacher 添加到 Person.teacherList 中。

关于java - 如何强制TopLink立即建立OneToMany关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4369030/

相关文章:

jakarta-ee - EJB中@Resource注解的mappedName和lookup属性有什么区别?

java - 经纪人网络 - ActiveMQ - 还有其他选择吗?

java - 运行简单 Servlet 类时出现问题

java - 无法让远程 EJB 与 Wildfly 上的 EJB 客户端 API 配合使用

java - 正确使用带有 Servlet 的有状态 Bean

Java:如何将 Arrays.copyOfRange() 与泛型类型一起使用?

java - 如何防止MySQL InnoDB通过JDBC为delete语句设置锁

java - 将 io.netty.buffer.ByteBuf 转换为 java.nio.ByteBuffer 的有效方法

SocketChannel.write() 的 Java NIO 线程问题

Java EE 事务回滚