2011-09-22 95 views
6

下面的代碼是默認生成的Spring Roo,EntityManager在您的域模型POJO中注入其餘方法來管理實體(save,update,delete,findXXX, ...)。Spring Roo:使用JPA實體作爲DAO

也許它是一個更面向對象的方法(在對比的是anemic domain model),但我不明白的是:

  • 有EntityManager的時候在每一個被注入任何性能問題(假設你從數據庫中檢索1000個實體)

  • 不應該是事務管理(@Transactional註釋)進入服務層嗎? (想象一下,你想以原子的方式使用兩個不同的實體)。

  • 您可以考慮一下經典DAO層的這段代碼的其他優點/缺點嗎?

的代碼看起來像這樣(爲清楚起見移除了一些方法):

@Configurable 
@Entity 
@RooJavaBean 
@RooToString 
@RooEntity 
public class Answer { 

    @PersistenceContext 
    transient EntityManager entityManager; 

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

    @Transactional 
    public void remove() { 
     if (this.entityManager == null) this.entityManager = entityManager(); 
     if (this.entityManager.contains(this)) { 
      this.entityManager.remove(this); 
     } else { 
      Answer attached = Answer.findAnswer(this.id); 
      this.entityManager.remove(attached); 
     } 
    } 

    @Transactional 
    public Answer merge() { 
     if (this.entityManager == null) this.entityManager = entityManager(); 
     Answer merged = this.entityManager.merge(this); 
     this.entityManager.flush(); 
     return merged; 
    } 

    public static final EntityManager entityManager() { 
     EntityManager em = new Answer().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; 
    } 

    public static long countAnswers() { 
     return entityManager().createQuery("SELECT COUNT(o) FROM Answer o", Long.class).getSingleResult(); 
    } 

    public static List<Answer> findAllAnswers() { 
     return entityManager().createQuery("SELECT o FROM Answer o", Answer.class).getResultList(); 
    } 

    ... 
} 

回答

3
  1. 你會發現更多關於這個在第三點的鏈接。

  2. 在典型的Roo應用程序中沒有獲得服務層。您的服務方法包含在實體本身內,因此可以在您的實體中使用@Transactional以確保特定方法涉及交易。但是,您將能夠使用最新的1.2版本的Spring Roo獲得單獨的服務層,這將使其成爲可能。

  3. ADM與DDD:關於SO的單獨問題將對此有所幫助。無論如何,您可以通過SpringSource Roo論壇上的此主題獲得很多見解。 http://forum.springsource.org/showthread.php?77322-Spring-Roo-with-a-services-DAO-architecture

乾杯和Roo一切順利! :)

+1

謝謝你的偉大的鏈接。它沒有真正回答的唯一問題是第一個。目前還不清楚何時以及如何在每個實體中注入EntityManager。 –

+0

@GuidoGarcía,你現在有答案嗎? – eric2323223

+0

@ eric2323223尚未 –