Wenn Sie PropertyEditors mit Spring MVC verwenden, ist es schlecht, sie Entitäten aus der Datenbank abrufen zu lassen? Sollte ich stattdessen eine leere Entität erstellen und ihre Id.
Zum Beispiel für die Entität Employee:
@Entity
@Table(name = "employee")
public class Employee implements GenericEntity<Integer>{
@Id
@GeneratedValue
@Column(name = "employee_id")
public Integer getEmployeeId() {
return employeeId;
}
public void setEmployeeId(Integer employeeId) {
this.employeeId = employeeId;
}
/** More properties here **/
}
Ist es eine schlechte Idee, die Entität im PropertyEditor unten mit dem folgenden GenericEntityEditor zu holen:
public class GenericEntityEditor<ENTITY extends GenericEntity<Integer>> extends PropertyEditorSupport {
private GenericDao<ENTITY, Integer> genericDao;
public GenericEntityEditor(GenericDao<ENTITY, Integer> genericDao) {
this.genericDao = genericDao;
}
@Override
public void setAsText(String text) throws IllegalArgumentException {
setValue(genericDao.findById(Integer.valueOf(text)));
}
@SuppressWarnings("unchecked")
@Override
public String getAsText() {
ENTITY entity = (ENTITY) getValue();
if(entity == null) {
return null;
}
return String.valueOf(entity.getId());
}
}
die im Controller gebunden werden können:
@Controller
public class EmployeeController {
/** Some Service-layer resources **/
@Resource
private EmployeeDao employeeDao; // implements GenericDao<ENTITY, Integer> genericDao
@SuppressWarnings("unchecked")
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Employee.class, new GenericEntityEditor(employeeDao));
}
/** Some request mapped methods **/
}
Ist es vorzuziehen, einen spezifischeren Ansatz mit einem EmployeeEditor zu verwenden und einfach eine Employee-Entität zu instanziieren und ihre ID festzulegen?
public class EmployeeEditor extends PropertyEditorSupport {
@Override
public void setAsText(String text) throws IllegalArgumentException {
Employee employee = new Employee();
employee.setId(Integer.valueOf(text));
}
@SuppressWarnings("unchecked")
@Override
public String getAsText() {
Employee employee = (Employee) getValue();
if(employee == null) {
return null;
}
return String.valueOf(employee.getId());
}
}
Auf diese Weise tun wir nicht einen Roundtrip zur DB jedes Mal, wenn ein Mitarbeiter auf ein Formular vorhanden ist, aber ich bin unsicher, ob dies funktioniert wie erwartet mit Hibernate?