一对多双向映射和持久性订单问题

时间:2013-06-06 06:33:51

标签: java jpa orm mapping

我有两个具有双向一对多关系的实体:

@ManyToOne
@JoinColumn(name = "department_id")
public Department getDepartment() {
    return department;
}

@OneToMany(mappedBy="department")
public Collection<EmployeeMapping> getEmployees() {
    return employees;
}

这是我的单元测试:

    Department object = new Department();
    object.setName("Test Department Object");
    assertEquals("Object ID is not persistent yet", 0L, object.getId());
    EmployeeMapping employee1 = new EmployeeMapping();
    employee1.setName("Employee 1");
    EmployeeMapping employee2 = new EmployeeMapping();
    employee2.setName("Employee 2");
    Collection<EmployeeMapping> collection = ImmutableSet.of( employee1, employee2 );
    object.setEmployees( collection );
    departmentDao.save(object);
    assertNotEquals("Object ID is persistent", 0L, object.getId());

    Department actualObject = departmentDao.get( object.getId() );
    assertEquals("The actual object in the database must be equal to the original value", object, actualObject);

employee1和employee2未保存。测试执行后,它们不在表中。 departme类型的actualObject - 确实存在。

我的问题是为什么当我使用departmentDao.get( object.getId() );获得一个代表时,actualObject有一组雇员,尽管他们无法从表中卸载。他们没有得救。也许departmentDao在里面使用缓存。我不确定,请解释一下。

无论如何,我希望objectactualObject在这个测试中不相同。我该如何存档?我希望他们只有在我挽救两名员工时才能平等。

最后一个问题,实体保存的顺序。员工和部门都有相互链接。这是一种双向关系。我应该首先保存一个部门,然后只有员工或订单无关紧要吗?你能帮我解释一下吗? 感谢。

1 个答案:

答案 0 :(得分:0)

“我希望实际的对象和对象不同”: 这取决于:

  1. equals方法的实现
  2. DAO的SET操作是否通过引用
  3. 更新“对象”

    保存one2many的顺序: 保存外键的对象应该保存最后。 在这个例子中你有:

    1. 员工(员工,姓名等......, departmentID
    2. 部门(departmentID,departmentNAme等)
    3. ==&GT;这意味着在保存员工时,部门应该已经全部保存(部门ID必须存在/得到解决)。

      • actualObject(从departmenDao中检索)包含员工的空集合,因为员工没有像你自己那样保存。

      希望这有帮助,欢呼!