gpt4 book ai didi

java - 使用 Hibernate 时未在多个事务中加载 Childs

转载 作者:行者123 更新时间:2023-11-30 01:07:37 24 4
gpt4 key购买 nike

这基本上是我的代码:

// Start first transaction to create a school

// Here I set a student for the school
school.setStudent(new Student(id));

// I Save

// Then I Start a SECOND transaction to retrieve the same school

// I can read the childs without prolem.
school.getStudent().getLanguage().getId();

现在,由于某些原因,我希望以上所有内容都在同一笔交易中。这就是发生的事情:

// Start the transaction to create a school

// Here I set a student that exist in the DB for that new school
school.setStudent(new Student(id));

// I Save

// In the same transaction I retrieve a list of schools, and one of the schools is the newly created.

// In the newly created school I can't access the childs: null pointer exception on language
school.getStudent().getLanguage().getId(); //ERRROR

第一种情况发生的是,即使我只为学生设置了 id,一旦持久化,该学生的所有其他信息都已经在数据库中,因为该学生不是新的。我只是想与学校建立一个协会。

但在第二种情况下,我还没有终止交易,并且由于某些原因,当我再次查询 schhol 时,学生只包含 id,而不包含所有其他信息。语言确实为空并产生异常。

我尝试添加 session.flush() 但没有解决问题。

你有什么想法吗?

最佳答案

您不想将学校学生设置为具有现有学生 ID 的新学生。您想要将学校学生设置为现有学生。因此,只需从数据库获取它,而不是重新创建它:

Student theExistingStudent = (Student) session.load(Student.class, id);
school.setStudent(theExistingStudent);

上面的代码甚至不会进行查询来从数据库中获取它。它将假设学生存在并向现有学生返回一个延迟初始化的代理。当然,如果你想确定学生确实存在,你也可以使用

Student theExistingStudent = (Student) session.get(Student.class, id);
school.setStudent(theExistingStudent);

关于java - 使用 Hibernate 时未在多个事务中加载 Childs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19634180/

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