2012-05-07 122 views
4

我們正在研究由Spring Roo生成的GWT項目,但我們不再使用Roo來編輯/生成類。相反,我們現在手動編寫所有東西。瞭解Spring Roo爲GWT生成的實體代碼

對於每個服務器端實體類Roo生成相當不可思議的EntityManager獲取代碼。不得不保持它,我想理解它,但我不知道。下面是從生成的實體代碼片段:

@PersistenceContext 
transient EntityManager entityManager; 

public static final EntityManager entityManager() { 
    EntityManager em = new Scenario().entityManager; 
    if (em == null) 
     throw new IllegalStateException(
       "Entity manager has not been injected (is the Spring Aspects JAR configured as an AJC/AJDT aspects library?)"); 
    return em; 
} 

@Transactional 
public void persist() { 
    if (entityManager == null) 
     entityManager = entityManager(); 
    entityManager.persist(this); 
} 

public static List<Scenario> findAllScenarios() { 
    List<Scenario> res = entityManager().createQuery(
      "select o from Scenario o order by o.name", 
      Scenario.class).getResultList(); 
    return res; 
} 

public static Scenario findScenario(Long id) { 
    if (id == null) 
     return null; 
    return entityManager().find(Scenario.class, id); 
} 

我的意見和問題:

  • 實例方法使用EntityManager場由Spring注入,這是很清楚。但爲什麼這件作品是:if(entityManager == null) entityManager = entityManager();?難道我們excpect是EntityManagerem領域應注射,不能null(或別的東西是錯誤的?)
  • 的靜態方法創建實體的新實例,並獲得其EntityManager場,爲什麼呢?不能是EntityManager緩存在靜態字段或類似的東西?
  • 爲什麼像findAllXXX這樣的讀取方法不是@Transictional?據我所知,根據JPA規範,所有JPA操作應該在交易的邊界內完成?
  • if (id == null) return null;件在findXXX方法真的有必要嗎?如果我們得到空作爲id參數來顯示出現問題,我們是不是應該崩潰應用程序?
  • 我們可以用更優雅的方式重寫這個EntityManager採集代碼嗎(例如沒有那個奇怪的new Entity().entityManager的東西)但是不會破壞它(可能有一些前提條件需要保留)?
  • 爲什麼EntityManager字段transient?這很重要嗎?

回答