非常确定这是微不足道的,但无法找到直接的答案。我有Dept / Emp表。 emp表中的dept_id是外键。这是一种经典的一对多关系。在Web应用程序中,在新员工页面上,dept是一个列出可用depts的Select控件。当用户提交页面时,我有Emp详细信息和部门ID。但是我不能在Emp类上设置Dept id,因为在Emp类中没有setter或getter to Dept id!
处理此问题的最佳方法是什么?
我正在使用Struts2 2.1.8 / hibernate 3.x / tomcat 6.0.26 / MySQL 5.5.x
答案 0 :(得分:0)
你应该在部门中设置一套Emp。并且如果一个emp可以存在于一个部门中,那么emp中将有多个部门,但是如果一个emp可以存在多于一个部门而不是你需要在Emp的部门。
请参考如何定义collection mapping in hibernate?
答案 1 :(得分:0)
您可以在服务层
中执行service.add(employee, id);
Service.add(Employee employee, String id)
中的
public void add(Employee employee, String id) {
Department department = session.get(Department.class, id);
employee.setDepartment(department);
session.persist(employee);
}
但您需要在Employee
课程中设置setter来设置员工的Department
答案 2 :(得分:0)
你有两个部门,即之前属于Emp的旧部门,以及用户选择Emp所属的新部门。两个部门中的每一个都有一套所有属于他们的雇员。
在一个事务中,您从旧部门中的雇员集合中删除Emp,将其添加到新部门中的雇员集合中,并使用session.update(Dept)更新这两个部门。如果你没有雇员的级联,你也必须更新Emp。
这看起来更复杂,但是这样两个部门中的雇员集合仍然是正确的,而在数据库方面,这应该只导致一个SQL语句。
答案 3 :(得分:0)
从我从这个问题中收集到的是你可能没有正确配置你的bean。您必须在bean中定义ORM映射,如下所示:
@Entity
@Table(name = "EmployeeMaster")
public class empBean {
@Column(name = "Name", nullable = false)
private String name;
@Column(name = "departmentFkId", insertable = true, updatable = true)
private Long departmentFkId;
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name = "departmentFkId", insertable = false, updatable = false)
private DepartmentMasterBean department;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public DepartmentMasterBean getDepartment() {
return department;
}
public void setDepartment(DepartmentMasterBean department) {
this.department = department;
}
public Long getDepartmentFkId() {
return departmentFkId;
}
public void setDepartmentFkId(Long departmentFkId) {
this.departmentFkId = departmentFkId;
}
}
现在您可以设置部门详细信息(empBean.setDepartmentFkId
),hibernate将通过会话(session.saveOrUpdate(empBean)
)处理其余的保存。