2011-04-08 17 views
5

對Spring MVC使用PropertyEditor時,讓它們從數據庫中獲取實體是不好的?我應該改爲創建一個空實體並設置其ID。在PropertyEditor中從數據庫中獲取實體

例如,對於實體員工:

@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:

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

這樣,我們不會在每一僱員表上存在的時間做一個往返到數據庫,但我不能確定這是否按照預期與Hibernate一起工作?

回答

6

我認爲這是合法的。我使用了這個技術一段時間了,它運行良好。

但是Spring 3.0有一個更好的概念。所謂的Converter(參考章節5.5 Spring 3 Type Conversion

此轉換器像單向屬性編輯器一樣工作。但是它們是無狀態的,並且由於這種更多的行爲,並且可以被重新引用!


加了: 有彈簧3.0> 3的not (yet) documented特徵:所述org.springframework.core.convert.support.IdToEntityConverter

它是在由所述ConcersationServiceFactory ConversationService自動註冊。

這個IdToEntityConverter會自動將一切(對象)轉換爲一個實體,如果實體!有一個靜態方法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生成的實體。

+0

一如既往的好答案(+1),但你不斷髮明單詞(performat,reuesed)。你知道大多數瀏覽器都有拼寫檢查器嗎? :-) – 2011-04-08 14:25:16

+0

@ Sean Patrick Floyd:我的瀏覽器拼寫檢查器適用於德語。但我想我應該把它改成英文。 – Ralph 2011-04-08 14:29:18

+0

我建議,因爲你的德語拼寫比你的英語拼寫好很多。或者使用專門的瀏覽器只是爲了:-) – 2011-04-08 14:40:02