Java Hibernate检索一对多关系中的错误对象列表
我刚开始冬眠。我得去学校和老师那里。一个系可以有许多教师,但一名教师只能隶属于一个系。我有以下映射:Java Hibernate检索一对多关系中的错误对象列表,java,hibernate,one-to-many,Java,Hibernate,One To Many,我刚开始冬眠。我得去学校和老师那里。一个系可以有许多教师,但一名教师只能隶属于一个系。我有以下映射: @Entity @Table(name = "department") public class Department { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private Integer id; @Column(name = "nam
@Entity
@Table(name = "department")
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;
@Column(name = "name")
private String name;
@Column(name = "description")
private String description;
@OneToMany (cascade=CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "department_id")
private List<Teacher> teachers = new ArrayList<Teacher>();
}
还有getter和setter,为了简单起见我省略了它们。
我正在使用MySql数据库。当我尝试在新的部门中加入新的教师时,一切都很顺利。但是,我也希望能够得到一个完整的部门名单和教师,分配给每个部门。目前在我的数据库中,我有5个部门和13个部门
老师们。但当我执行以下代码时:
DepartmentDaoImpl ddi = new DepartmentDaoImpl();
List<Department> departments = ddi.getAllDepartment();
for (Department k : departments){
printDepartmentData(k);
List<Teacher> teachers = k.getTeachers();
for (Teacher t : teachers){
printTeacherName(t);
}
}
我有13个部门的例子。我有5个第一系的例子(我有5个老师分配给它),每个都有相同的5个老师分配,两个第二系的例子(我有两个老师分配给它),每个都有两个相同的老师分配,依此类推。
有人能想出,怎么解决它吗?我需要获得5个部门实例,使用相应数量的教师。进行以下更改并测试
@OneToMany (cascade=CascadeType.ALL, fetch = FetchType.EAGER, mappedBy="department")
private List<Teacher> teachers = new ArrayList<Teacher>();
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER,mappedBy=“department”)
私人列表教师=新建ArrayList();
因为您使用fetch=FetchType.EAGER配置了一对多关系,所以hibernate对这两个表执行联接。您看到的结果是由此联接引起的
确保在部门
和教师
中都有正确的equals()
和hashCode()
方法。如果这不能解决问题,请尝试使用集合
而不是列表
尝试更改为:
@OneToMany (mappedBy="department", cascade=CascadeType.ALL, fetch = FetchType.EAGER)
private Set<Teacher> teachers = new HashSet<Teacher>();
致:
在你的刀上试试这个,会有帮助的
结果=(ArrayList)session.createCriteria(Department.class)。setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list() 能否显示DepartmentDaoImpl.getAllDepartment()
的实现?尝试删除@JoinColumn(name=“department\u id”)
并重新运行,然后会发生什么情况?@mthmulders添加到post@Angga然后我得到了一张空的教师名单,但只有五个系的例子看看我的答案,您的问题是您将部门id称为部门内部的FK如果我理解正确,我应该删除JoinColumn注释吗?如果是这样的话,我会得到相同的结果。你必须添加mappedBy=“department”你能发布你的getTeachers()和getDepartment()方法吗?我有getTeacherById(int id),getAllTeachers()返回表中的所有教师,department也是这样。哪一个应该发布?不,在教师课堂上,你需要为私人部门部门设置getter和setter方法,同样在部门课堂上,你需要为私人列表教师设置getter和setter方法。如果如你所说,将JoinColumn设置为“id”,我将在每个部门只设置一名教师。该教师通过教师表中的id(主键)添加到部门。我在帖子中添加了我的SQL,也许会更清楚。对不起,我的不好,我误导了mappedBy和JoinColumn。现在已修复,该工作由我完成,但我在教师实体中测试它时没有获取,也没有多对一编辑,请给出教师内部部门指定转换为设置帮助的示例。但这是冬眠的正确方式吗?对我来说,这种方法似乎是一种变通方法。不,这是正确的方法。如果查看Hibernate教程,您会发现它们也使用了Set
方法
CREATE TABLE teacher (
id INTEGER PRIMARY KEY auto_increment,
fName varchar(30),
lName VARCHAR(30),
degree VARCHAR(100),
department_id INTEGER
);
CREATE TABLE department(
id INTEGER PRIMARY KEY auto_increment,
name VARCHAR(100),
description VARCHAR(5000)
);
@OneToMany (cascade=CascadeType.ALL, fetch = FetchType.EAGER, mappedBy="department")
private List<Teacher> teachers = new ArrayList<Teacher>();
@OneToMany (mappedBy="department", cascade=CascadeType.ALL, fetch = FetchType.EAGER)
private Set<Teacher> teachers = new HashSet<Teacher>();
@ManyToOne
private Department department;
@Collumn(name = "department")
private Integer department;