表单和实体类用法

时间:2017-11-03 18:26:18

标签: java hibernate spring-mvc jpa spring-data-jpa

使用FormEntity课程的最佳做法是什么?我应该使用与FormEntity相同的课程,还是应该为此目的使用不同的Pojos?每种情况都有利弊:

  1. FormEntity在一个类中:您减少了项目中Pojos的数量(可能某些Form类将与Entity类完全相同)。但实体类看起来很丑,PersistenceValidation注释在一个类中组合在一起,验证也在上层(web),而持久性是一个较低级别(dao)操作,似乎不太好使用与表单和实体相同的类。
  2. FormEntity为不同的Pojos:您的课程看起来不错,Form pojos只有Validation个注释,而Entity pojos只有Persistence注释,因此您可以轻松关注项目的每个部分。但是,您增加了项目中的类数,这是表单/实体类的附加包。并且应该为Form -> Entity转换添加转换器方法/类。
  3. 我知道这个问题是由你决定的,但我想通过解释了解最佳做法。

    提前致谢。

1 个答案:

答案 0 :(得分:1)

首先,我需要解释一下,在几乎所有情况下,模型都可以解决问题,并且不需要为UI提供另一个类,您只需将模型发送到控制器中的客户端。但在某些复杂的情况下,您可能不需要这样做。例如,考虑模型之间的关系非常复杂并且彼此相关以理解下面关系的主题。

public class Department {
    String departmentName;
    List <Employee> employeeList;
}

public class Employee {
    String firstName;
    String lastName
    Department department;
    List <Job> jobList;
}

public class Job {
    Integer id;
    String jobTitle;
    Employee employee;
    User createdBy;
    User updatedBy;
}

public class User {
    String username;
    List <Department> departmentList;
}

在这种情况下,UI层中显示的模型请求与第一个不同。在我看来,这种情况有两个原因。

1)模型需要一个基本上获取事物聚合的属性的状态。例如,在这种情况下,每个部门的代表和员工数量。使用DTO方法,应该创建一个新类。

public class DepartmentDTO {
    String departmentName;
    Long employeeCount;
}

2)显示的信息是信息的不同部分的情况。例如,考虑是否需要上述信息仅显示与Job相关的信息,如下所示

 public class JobViewModel {
    Integer id;
    String jobTitle;
    String employeeFirstName;
    string employeeLastName;
}


public class JobViewModel2 {
    Integer id;
    String jobTitle;
    String employeeFirstName;
    String employeeLastName;
    String employeeDepartmentName;
    String createdByUsername;
    String updaedByUsername;
}

如您所见,在这种情况下,您需要拥有原始模型的不同视图。这种转变如何运作?在这里,您需要一个mapstruct和推土机框架。这些框架的任务是将此模型转换为ViewModel。