我有一对一的关系,我正在努力坚持一个子实体.
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);
如何在一个操作中将成绩保存到办公桌上
解决方法
首先,修复你的映射.
该关联是双向的,并且侧面(一侧)中的一个必须使用mappedBy属性标记为另一方的倒数:
@OneToMany(mappedBy = "office") public set<Employee> employees;
员工只是办公室的员工之一.删除单个员工时,是否真的要删除整个办公室?如果没有,为什么在@ManyToOne上放一个cascade = cascadeType.ALL?这些注释有后果.不要在没有理解的情况下使用它们.
现在真的回答这个问题.如果办公室已经存在于数据库中,那么你不应该建立一个新的.从数据库中取出并更新它:
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);