Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一对多双向映射和持久顺序问题_Java_Jpa_Orm_Mapping - Fatal编程技术网

Java 一对多双向映射和持久顺序问题

Java 一对多双向映射和持久顺序问题,java,jpa,orm,mapping,Java,Jpa,Orm,Mapping,我有两个具有双向一对多关系的实体: @ManyToOne @JoinColumn(name = "department_id") public Department getDepartment() { return department; } @OneToMany(mappedBy="department") public Collection<EmployeeMapping> getEmployees() { return employees; } @ManyT

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

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

@OneToMany(mappedBy="department")
public Collection<EmployeeMapping> getEmployees() {
    return employees;
}
@ManyToOne
@JoinColumn(name=“部门id”)
公共部门{
退货部;
}
@OneToMany(mappedBy=“部门”)
公共集合getEmployees(){
返回员工;
}
下面是我的单元测试:

    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);
部门对象=新部门();
object.setName(“测试部门对象”);
assertEquals(“对象ID尚未持久化”,0L,Object.getId());
EmployeeMapping employee1=新EmployeeMapping();
雇员1.设置名称(“雇员1”);
EmployeeMapping employee2=新EmployeeMapping();
雇员2.设置名称(“雇员2”);
Collection Collection=ImmutableSet.of(employee1,employee2);
对象。setEmployees(集合);
departmentDao.save(对象);
assertNotEquals(“对象ID是持久的”,0L,Object.getId());
Department actualObject=departmentDao.get(object.getId());
assertEquals(“数据库中的实际对象必须等于原始值”,object,actualObject);
不保存employee1和employee2。测试执行后,它们不在表中。actualObject-属于Departme类型-不存在

我的问题是,当我使用:
departmentDao.get(object.getId())获取一个部门时,为什么要这样做
虽然不能从表中卸载员工,但
actualObject
有一个员工集合。他们没有得救。也许departmentDao在内部使用缓存。我不确定,请解释一下

无论如何,我希望
object
actualObject
在这个测试中不相等。如何存档?我希望只有当我拯救两名员工时,他们才会平等

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

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

  • equals方法的实现
  • DAO的SET操作是否通过引用更新“对象”
  • 保存one2many的顺序: 保存外键的对象应最后保存。 在本例中,您有:

  • 员工(员工ID、姓名等,部门ID
  • 部门(部门ID、部门名称等)
  • ==>这意味着在保存员工时应保存部门allready(部门id必须存在/已解析)

    • actualObject(从DepartmentDao检索)包含空的员工集合,因为员工并没有像您自己所说的那样保存

    希望这有帮助,干杯

    最后一个问题。actualObject不包含空Collection。我无法理解为什么。