2011-04-08 6 views
5

Al usar PropertyEditors con Spring MVC ¿es malo tener que obtener entidades de la base de datos? Debo, en cambio, crear una entidad vacía y establecer su Id.Obteniendo Entidades de DB en un PropertyEditor

Por ejemplo, para la entidad empleado:

@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 **/ 
} 

¿Es una mala idea para buscar a la Entidad en el PropertyEditor a continuación con la siguiente GenericEntityEditor:

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()); 
    } 
} 

que se pueden unir en el controlador :

@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 **/ 

} 

¿Es preferible utilizar un enfoque más específico? con un EmployeeEditor y tienen sólo una instancia de una entidad del empleado y establecer su 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()); 
    } 
} 

De esta manera no hacemos un ida y vuelta a la base de datos cada vez que existe un Empleado en un formulario, pero no estoy seguro si esto funciona como se esperaba con Hibernate?

Respuesta

6

Creo que es legal. Utilicé esta tecnología por un tiempo, y funcionó bien.

Pero Spring 3.0 tiene un mejor concepto. Llamado Converter (Capítulo de referencia 5.5 Spring 3 Type Conversion)

Estos convertidores funcionan como editores de propiedades unidireccionales. ¡Pero son apátridas, y debido a esto más performat, y pueden ser contados!


Agregado: Hay una característica de la primavera not (yet) documented 3.0>. 3: el org.springframework.core.convert.support.IdToEntityConverter

Se registra automáticamente en el ConversationService por el ConcersationServiceFactory.

Este IdToEntityConverter automáticamente convertirá todo (Objeto) a una Entidad, si la entidad !! tiene un método estático find<entityName> que tiene un parámetro y el tipo de retorno es del tipo de la entidad.

/** 
* 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 
*/ 

Si tiene dudas sobre cómo implementar un método de búsqueda estático en su entidad. Luego eche un vistazo a las entidades generadas por Spring Roo.

+0

buena respuesta como siempre (+1) pero sigues inventando palabras (performat, recapituladas). ¿Sabes que hay correctores ortográficos disponibles para la mayoría de los navegadores? :-) –

+0

@Sean Patrick Floyd: el corrector ortográfico de mi navegador es para el idioma alemán. Pero supongo que debería cambiarlo al inglés. – Ralph

+0

Sugeriría eso porque tu ortografía alemana es mucho mejor que tu ortografía inglesa. O use un navegador dedicado solo para SO :-) –

Cuestiones relacionadas