使用像@OneToMany这样的关系,@ ManyToOne在hibernate中是不是很好的做法?

时间:2016-10-19 19:10:20

标签: java hibernate jpa

使用像@OneToMany这样的关系,@ SpringToOne在java spring boot hibernate项目中是不是很好用?

1 个答案:

答案 0 :(得分:0)

无论良好做法,这里的重点是你有两种选择来模拟这个:

  1. 选择在Department上手动分配Employee的ID。
  2. 在保存时将新Employee与现有Department实体相关联。
  3. 你选择的确实取决于许多因素。

    在处理未强加外键约束的遗留系统或不想强加这些约束的情况下,通常会选择前者。这通常是两者中较为罕见的情况,但在特定情况下这是有道理的。

    后者是更受青睐的方法,因为实体域模型不仅最好地代表数据库模型隐含的限制和约束,还传达了域专家使用的限制。例如,如果没有与有效Employee相关联,则无法保存Department。因此,您为员工分配Department而不是其标识符。

    当然,您所选择的选择会对您可以针对实体模型发出的查询类型产生一些影响,但影响很小。

    private Department getDepartmentById(Long departmentId)
      throws InvalidDepartmentException {
      try {
        return entityManager.getReference( Department.class, departmentId );
      }
      catch ( EntityNotFoundException e ) {
        throw new InvalidDepartmentException( departmentId, e );
      }
    } 
    
    private List<Employee> getEmployeesNoAssociation(Long departmentId) 
      throws InvalidDepartmentException {
      final Department dept = getDepartmentById( departmentId );
      return entityManager
        .createQuery( "SELECT e FROM Employee e WHERE e.departmentId = :id", Employee.class )
        .setParameter( "id", dept.getId() )
        .getResultList();
    }
    
    private List<Employee> getEmployeesWithAssociation(Long departmentId) 
      throws InvalidDepartmentException {
      final Department dept = getDepartmentById( departmentId );
      return entityManager
        .createQuery( "SELECT e FROM Employee e WHERE e.department = :dept", Employee.class )
        .setParameter( "dept", dept )
        .getResultList();
    }
    

    简而言之,良好做法是将您的域建模为其预期用途。这是否适用于您是否使用关联映射取决于您的情况。