在Spring MVC中使用PropertyEditor时,让它们从数据库中获取实体是否不好?我应该改为创建一个空实体并设置其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中获取Entity是一个坏主意:
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()); } }
这样,我们不会在窗体上每次有Employee时都进行往返数据库的访问,但是我不确定Hibernate是否可以按预期运行?
我认为这是合法的。我使用这种技巧已有一段时间,并且效果很好。
但是Spring 3.0有一个更好的概念。所谓的转换器(参考第5.5章Spring 3类型转换)
此转换器的工作方式类似于属性编辑器的一种方式。但是它们是无状态的,并且由于具有更高的性能,因此可以被使用!
补充:Spring 3.0 没有(尚未)记录的功能。> 3:org.springframework.core.convert.support.IdToEntityConverter
它由ConcersationServiceFactory自动在ConversationService中注册。
如果实体,则此IdToEntityConverter会自动将所有内容(对象)转换为实体!有一个find<entityName>带有一个参数的静态方法,返回类型是实体的类型。
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生成的实体。