【问题标题】:Setting/Getting foreign key in Hibernate & Java在 Hibernate 和 Java 中设置/获取外键
【发布时间】:2012-03-26 08:21:23
【问题描述】:

很确定这是微不足道的,但无法找到直截了当的答案。我有部门/雇员表。其中 emp 表中的 dept_id 是外键。这是一个经典的一对多关系。在 Web 应用程序中,在新员工页面上,部门是一个选择控件,列出可用部门。当用户提交页面时,我有 Emp 详细信息和部门 ID。但是我无法在 Emp 类上设置 Dept id,因为 Emp 类中没有 Dept id 的 setter 或 getter!

处理这个问题的最佳选择是什么?

我正在使用 Struts2 2.1.8/hibernate 3.x/tomcat 6.0.26/MySQL 5.5.x

【问题讨论】:

  • 您是使用 Hibernate 还是仅使用 Hibernate 进行 JPA?
  • 非常感激地看着答案,我需要澄清我在寻找什么。在提交新员工时,我的操作会收到填充了用户输入(包括部门 ID)的请求对象。所以我继续创建员工类并使用设置器添加用户的输入。但是 Hibernate Emp 类没有 Dept id 的设置器,因为它是外键。我能做的是查找 Dept 并将 dept 分配给 Emp。但这对于一个简单的 setDeptId(value) 来说似乎太过分了!

标签: java hibernate struts2 foreign-keys


【解决方案1】:

你应该有一组 Emp in Dept。如果一个 emp 可以存在于一个部门中,那么 emp 中的部门将是多对一的,但如果一个 emp 可以存在多个部门,则需要你设置部门在 Emp.

请参考collection mapping in hibernate如何定义?

【讨论】:

  • 谢谢,但不是我真正要问的。请参阅我对@Pau-Kiat 的评论。
  • Dept 和 Emp 之间存在一对多的关系。如果我没记错的话,你们的关系就像一个部门有多个员工。所以,你已经在 Dept 中设置了。如果你有这样的关系,那么你可以使它成为双向的,你可以在 Emp 中放置多对一的 Dept。因此,当您获得 deptId 时,您只需简单地创建 Dept 的对象并在该对象中设置 deptId。现在,在 Emp 中设置 Dept 对象,最后保存 Emp 对象。如果您使用 set 而不是 List,这将起作用。因为我们需要保持位置。
  • 谢谢。这正是我现在正在做的。作为一名传统的开发人员,我希望有一种更直接的方式,即我不创建 dept 对象,而只需在 emp 对象上设置 det_id(即 emp.setDeptId(value))
【解决方案2】:

你可以在服务层做

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

【讨论】:

  • 谢谢,但这不是我的问题(我的错),我正在尝试在员工中设置部门 ID。例如:员工e; ... e.setDeptId(value);
【解决方案3】:

你有两个部门,一个是 Emp 之前所属的旧部门,另一个是用户现在选择 Emp 所属的新部门。两个部门中的每一个都有一个集合,其中包含属于他们的所有员工。

在一个事务中,您从旧部门的雇员集合中删除 Emp,将其添加到新部门的雇员集合中,并使用 session.update(Dept) 更新这两个部门。如果您没有员工的级联,您也必须更新 Emp。

这看起来比较复杂,但是这样一来,两个部门的员工集仍然是正确的,在数据​​库端这应该只会导致一条 SQL 语句。

【讨论】:

  • 谢谢,但不是我要问的。请参阅我对@Pau-Kiat 的评论。
  • 更新新部门时,hibernate会自动设置属于该部门的员工的deptId。
【解决方案4】:

从我从这个问题中收集到的信息是,您可能没有正确配置您的 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))处理其余的保存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-18
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    • 2011-10-02
    • 2017-06-20
    • 1970-01-01
    相关资源
    最近更新 更多