我在 MySQL 数据库的桥接表中有四条记录。在 hibernate 中使用@ManyToMany,我得到了准确的员工顺序,但得到了不正确的项目顺序。以下是找出我在哪里犯错误所需的 Material 。
这是来源。
@Entity
@Table(name="PROJECT")
public class ProjectBean {
@Id @GeneratedValue @Column(name="PROJECT_ID")
private int projectId;
@Column(name="TITLE")
private String projectTitle;
@ManyToMany(mappedBy="projects")
private Collection<EmployeeBean> employees;
public ProjectBean() {
employees = new ArrayList<EmployeeBean>();
}
//getters & setters
}
@Entity
@Table(name="EMPLOYEE")
public class EmployeeBean {
@Id @GeneratedValue @Column(name="EMPLOYEE_ID")
private int employee_id;
@Column(name="FIRST_NAME")
private String firstName;
@Column(name="LAST_NAME")
private String lastName;
@ManyToMany
@JoinTable(name="EMPLOYEE_PROJECT",joinColumns=@JoinColumn(name="EMPLOYEE_ID"),inverseJoinColumns=@JoinColumn(name="PROJECT_ID"))
private Collection<ProjectBean> projects;
public EmployeeBean() {
projects = new ArrayList<ProjectBean>();
}
//getters and setters goes here
}
最后是主类,我试图以与我们在最上面的图像中看到的相同的顺序遍历列表。
ArrayList<ProjectBean> projects = (ArrayList<ProjectBean>)session.createQuery("SELECT projects FROM EmployeeBean").list();
ArrayList<EmployeeBean> employees = (ArrayList<EmployeeBean>)session.createQuery("SELECT employees FROM ProjectBean").list();
System.out.println("EmpID\tPrjID");
int i = 0;
for (EmployeeBean employeeBean : employees) {
System.out.print(employeeBean + "\t");
ProjectBean projectBean = (ProjectBean) projects.get(i);
i++;
System.out.println(projectBean);
}
最佳答案
你的代码确实没有意义。您迭代员工,对于员工列表中索引 i
处的每个员工,您将打印项目列表中索引 i
处的项目。
如果要显示每个员工的所有项目,则需要一个查询和两个嵌套循环:
List<EmployeeBean> employees = session.createQuery("SELECT e FROM EmployeeBean e").list();
for (EmployeeBean employee : employees) {
System.out.println(employee);
for (Project project : employee.getProjects()) {
System.out.println("\t" + employee);
}
}
另外,请注意,我没有将查询返回的列表强制转换为 ArrayList:这完全没有用,仅因为 Hibernate 碰巧返回 ArrayList 而起作用。它可以选择返回任何其他 List 实例,并且您的代码将会中断。在接口(interface)上编程。
关于java - hibernate中M-M关系中的记录顺序不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29934802/