我的專案課 -
@Entity
public class Project {
@Id
private Integer projectId;
private String projectName;
@ManyToMany(mappedBy = "projects")
private List<Employee> employees;
}
我的員工班 -
@Entity
public class Employee {
@Id
private Integer employeeId;
private String employeeName;
@ManyToMany
private List<Project> projects;
}
我的主要課程 -
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Employee employee1 = new Employee();
employee1.setEmployeeId(1);
employee1.setEmployeeName("Harry");
Employee employee2 = new Employee();
employee2.setEmployeeId(2);
employee2.setEmployeeName("Ron");
Project project1 = new Project();
project1.setProjectId(3);
project1.setProjectName("ABC");
Project project2 = new Project();
project2.setProjectId(4);
project2.setProjectName("DEF");
List<Project> projectList = new ArrayList<>();
projectList.add(project1);
projectList.add(project2);
employee1.setProjects(projectList);
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
session.save(employee1);
session.save(employee2);
session.save(project1);
session.save(project2);
transaction.commit();
Project project3 = session.get(Project.class, 3);
System.out.println(project3.getProjectId() " " project3.getProjectName());
for(Employee employee : project3.getEmployees()){
System.out.println(employee.getEmployeeId() " " employee.getEmployeeName());
}
session.close();
sessionFactory.close();
運行上述代碼時,employee1、employee2、project1、project2 已成功保存到資料庫中,但我得到了一個NullPointerExceptionwith project3.getEmployees().
但是下次我運行代碼時(所有保存命令都已注釋),project3.getEmployees()它不為空并且包含 Employee(employeeId=1, employeeName="Harry")。
是否有任何時間延遲,因為我第一次得到 a NullPointerExceptionwith project3.getEmployees()?
注意 -在任何一種情況project3.getProjectId()下project3.getProjectName()都不要回傳 null。
uj5u.com熱心網友回復:
在將它們保存到資料庫之前,您必須手動正確管理它們之間的關系Project。Employee為方便起見,可以在上面創建一個實體方法Employee來封裝這樣的邏輯,而不是直接設定員工的專案串列。
public class Employee {
public void addProject(Project project){
this.projects.add(project);
project.getEmployees().add(this);
}
}
并通過以下方式管理他們的關系:
employee1.addProject(project1);
employee1.addProject(project2);
當然你可以用其他方式來做,將員工添加到專案中:
public class Project {
public void addEmployee(Employee employee){
this.employees.add(employee);
employee.getProjects().add(this);
}
}
并通過以下方式管理他們的關系:
project1.addEmployee(employee1);
project2.addEmployee(employee1);
當你得到project3時,它只是從as both回傳你的project1實體并參考相同的 ID。由于您之前沒有正確管理員工,因此它有 NULL 員工串列,因此您得到了。Sessionproject1project3project1NullPointerException
再次執行它的時間project3是從資料庫加載的,休眠已經幫助自動管理它們的關系,因此你沒有得到NullPointerException
如果您確實想自己管理關系,您可以session.refresh(employee1)在事務提交后呼叫以強制休眠從資料庫重繪 其最新狀態,這不應該解決NullPointerException:
....
transaction.commit();
session.refresh(project1);
Project project3 = session.get(Project.class, 3);
System.out.println(project3.getProjectId() " " project3.getProjectName());
for(Employee employee : project3.getEmployees()){
System.out.println(employee.getEmployeeId() " " employee.getEmployeeName());
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/414183.html
標籤:
下一篇:SpringBootJPA-User和UserStats之間映射的多對一關系,但是當我從Repo獲取用戶時,沒有UserStats物體?
