2011-04-08 5 views
5

Spring MVC özellikli PropertyEditors kullanıldığında, varlıkların veritabanından varlık alması kötü mü? Bunun yerine boş bir varlık oluşturmalı ve onun kimliğini ayarlamalı mıyım?PropertyEditor'da DB'den Varlıkları Getirme

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

denetleyici bağlanmış olabilir: Aşağıdaki GenericEntityEditor aşağıda PropertyEditor içinde Varlık getirmesi kötü bir fikir

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

mi: varlık Çalışan Örneğin

:

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

} 

Daha özel bir yaklaşım kullanmak tercih edilir mi? Bir EmployeeEditor ile ve var bu sadece bir Çalışan varlık örneğini ve kimliğini ayarlayın: Bu eğer emin değilim

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

biz DB için bir Çalışan bir form üzerinde var olan her bir gidiş dönüş yapmayın Bu şekilde, fakat Hazırda beklemede beklendiği gibi çalışır?

cevap

6

Yasal olduğunu düşünüyorum. Bu tekniği bir süre kullandım ve işe yaradı.

Ancak Spring 3.0'ın daha iyi bir konsepti vardır. Converter (Referans Bölümü 5.5 Spring 3 Type Conversion)

Bu dönüştürücüler, tek yönlü özellik düzenleyicileri gibi çalışır. Ama onlar Vatansız, ve bu daha çok performattan dolayı ve yeniden üretilebilir!


Eklendi:. Orada Bahar 3.0> 3 bir not (yet) documented özelliğidir: org.springframework.core.convert.support.IdToEntityConverter

otomatik ConcersationServiceFactory tarafından ConversationService kayıtlı.

Bu IdToEntityConverter, varlık varsa, her şeyi (Nesne) bir Varlığa otomatik olarak dönüştürür! bir parametresi olan ve dönüş tipi öğenin türüne sahip olan statik find<entityName> yöntemine sahiptir.

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

Eğer varlık böyle bir statik bulucu yönteminin nasıl uygulanacağını şüphe varsa. Daha sonra Spring Roo tarafından oluşturulan varlıklar için bir göz atın.

+0

her zamanki gibi iyi bir yanıt (+1) ancak kelimeleri icat etmeye devam edersiniz (performat, yeniden). Çoğu tarayıcı için yazım denetleyicisi bulunduğunu biliyor musunuz? :-) –

+0

@Sean Patrick Floyd: Tarayıcımın yazım denetleyicisi almanca içindir. Ama sanırım ingilizceye değiştirmeliyim. – Ralph

+0

Bunu öneririm çünkü Almanca yazımınız ingilizce yazımınızdan çok daha iyi. Ya da sadece SO :-) –