2016-10-19 14 views

答えて

0

かかわらず良い練習の、ここでのポイントは、あなたがこれをモデル化するための2つのオプションがあります:

  1. 次期手動EmployeeDepartmentのIDを割り当てることを。
  2. 保存時に新しいEmployeeと既存のDepartmentエンティティを関連付けます。

あなたが実際に選ぶのはいくつかの要因によって決まります。

外部キー制約が課せられていないレガシーシステムや、それらの制約を課したくない状況では、前者が頻繁に使用されます。これは多くの場合、2つのケースのほうが稀ですが、特定の状況下では理にかなっています。

エンティティドメインモデルは、データベースモデルによって暗示されている制限や制約を最もよく表しますが、ドメインエキスパートが使用する制限も示しています。たとえば、有効なDepartmentに関連付けられていなければEmployeeを保存することはできません。したがって、従業員には識別子ではなく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(); 
} 

は要するに、良い練習は、その使用されることを意図したとおりに、あなたのドメインをモデル化することです。関連マッピングを使用するかどうかは、状況に応じて大きく異なります。

関連する問題