java - Hibernate 多对一关系刷新

标签 java hibernate refresh one-to-many hibernate-mapping

我有这个 2 域模型:

员工

public class Employee {

    private Long    id; 
    private String  name;
    private String  family;
    private Company company;

    //getter & setter

}

和公司:

公开类公司{

private Long            id; 
private String          name; 
private Set<Employee>   employees;

//getter & setter 

}

并且 Employee 与 Company 是多对一关系,而从 Company 端来看是一对多关系。

我在事务中保存一个公司对象,并在保存该公司的员工后:

@Transactional
puplic Long Save (){
        Company cmp=new Company(); 
        cmp.setName("Oracle");
        session.save(cmp);
        Employee employee=new Employee();
        employee.setName("james");
        employee.setFamily("dep");
        employee.setCompany(cmp);
        cmp.getEmployees();//will raise NullPointerException
        cmp=session.get(cmp.getId());//because of first level cache it doesnt load it 
    }

保存员工后,如果我想从公司获取员工集合,它会引发空指针异常,如果我想加载它,因为一级缓存,hibernate不会接触数据库,并且员工集仍然存在无效的 。

第一个解决方案是我可以在保存员工后刷新 Company 对象,但我认为 hibernate 必须有除此之外的解决方案。

最佳答案

您永远不应该使用 null 集合,因此您应该将映射更改为:

private Set<Employee>   employees = new HashSet<>();

这样,您甚至不需要 setter,因为 getter 就足够了。另外,请确保同步双向关联的双方:

public void addEmployee(Employee employee) {
     employees.add(employee);
     employee.setCompany(this);
}

public void removeEmployee(Employee employee) {
     employees.remove(employee);
     employee.setCompany(null);
}

您还需要implement equals and hashCode properly in your child entity类。

关于java - Hibernate 多对一关系刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42781811/

相关文章:

java - .getVersion() 不存储浏览器版本号

java - 随时随地访问 HttpServletRequest

java - Hibernate session.update 插入行而不是更新行

javascript - 刷新生成的图像

javascript - PHP & Jquery 使用外部文件刷新 id

java 。帮助找出为什么我的代码不起作用

javascript - 在 java 代码之后调用 Javascript 函数

java 使用扫描仪进行 I/O 和文件重定向

sql - 查询是否存在多个多对多关系

matlab - 提高 App Designer UI 元素的刷新率