gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:59:05 25 4
gpt4 key购买 nike

我有两个实体,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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com