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