在Spring MVC中使用PropertyEditors时,让它们从数据库中获取实体是不是很糟糕?我是否应该创建一个空实体并设置其Id。
例如,对于实体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 **/
}
使用以下GenericEntityEditor获取下面PropertyEditor中的实体是一个坏主意:
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());
}
}
可以在控制器中绑定:
@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 **/
}
是否首选对EmployeeEditor使用更具体的方法,并让它只是实例化一个Employee实体并设置其id:
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());
}
}
这样,每次在Form上存在Employee时,我们都不会对DB进行往返,但我不确定这是否与Hibernate一样正常工作?
答案 0 :(得分:6)
我认为这是合法的。我使用这种技术已经有一段时间了,而且效果很好。
但Spring 3.0有一个更好的概念。所谓的Converter(参考章节5.5 Spring 3 Type Conversion)
此转换器的工作方式与单向属性编辑器相同。但是他们是无国籍的,因为这种更好的形式,可以被重新考虑!
添加了: Spring 3.0有一个not (yet) documented功能。&gt; 3:org.springframework.core.convert.support.IdToEntityConverter
它由ConcersationServiceFactory自动在ConversationService中注册。
如果实体!! IdToEntityConverter会自动将所有内容(Object)转换为实体!有一个静态方法find<entityName>
,它有一个参数,返回类型是实体的类型。
/**
* Converts an entity identifier to a entity reference by calling a static finder method
* on the target entity type.
*
* <p>For this converter to match, the finder method must be public, static, have the signature
* <code>find[EntityName]([IdType])</code>, and return an instance of the desired entity type.
*
* @author Keith Donald
* @since 3.0
*/
如果您对如何在实体中实现此类静态查找程序方法有疑问。然后看看Spring Roo生成的实体。