JPA级联持续存在 - 多对一

时间:2011-08-13 07:55:18

标签: jpa-2.0

我有多对一的关系,我试图坚持一个子实体。

public class Office
{
public int id;
public int grades;
@OneToMany
public set<Employee> employees;
}

public class Employee{
@GeneratedValue(strategy=GeneratedValue.identity)
public int empid;
@ManyToOne(cascade=cascadeType.ALL)
public Office office;
}

Office ID已存在于数据库中。但员工不是。 现在,如果我要添加一名员工,他的成绩必须进入办公室数据库。

当我执行以下操作时,成绩不会被保存

Office office = new Office();
office.setId(23);
office.setGrades(5);
employee.setOffice(office);
em.persist(employee);

如何通过一次操作将成绩保存到办公桌中

1 个答案:

答案 0 :(得分:16)

首先,修复您的映射。

关联是双向的,并且必须使用mappedBy属性将其中一侧(一侧)标记为另一侧:

@OneToMany(mappedBy = "office")
public set<Employee> employees;

员工只是办公室的一名员工。删除单个员工时,您真的想要删除整个办公室吗?如果没有,为什么要在cascade=cascadeType.ALL上加@ManyToOne?那些注释会产生后果。不理解它们就不要使用它们。

现在要真正回答这个问题。如果办公室已存在于数据库中,则不应构建新的办公室。从数据库中获取并更新它:

Office office = em.find(Office.class, 23);
// office is now attached, and any change you make on the entity will be written to the database
office.setGrade(5);

现在您也可以将办公室附加给新员工。但由于它是双向关系,您还应该初始化关联的另一面以保持对象图形连贯:

employee.setOffice(office);
office.addEmployee(employee);
em.persist(employee);