2012-05-07 9 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フィールドを使用し、それはかなり明確だここで生成されたエンティティコードからの抜粋です。しかし、なぜこの作品は:if(entityManager == null) entityManager = entityManager();?我々はem分野でEntityManagerが注入されなければならないとnullをすることができないというexcpectないでください(または他の何かが間違っている?)
  • staticメソッドは、エンティティの新しいインスタンスを作成し、そのEntityManagerフィールドを取得し、なぜですか?静的フィールドなどにキャッシュされたEntityManagerにできませんでしたか?
  • findAllXXXのような読み取り方法が@Transictionalでないのはなぜですか?私が知っていることから、JPA仕様によれば、すべてのJPA操作はトランザクションの境界内で行われるべきですか?
  • findXXXの方法で実際に必要な方法はif (id == null) return null;ですか? idというパラメータをnullにすると、何か問題があることを示すためにアプリケーションをクラッシュさせるべきではありませんか?
  • このようなの取得コードをより洗練された方法(たとえば、奇妙なnew Entity().entityManagerのもの)で書き直すことはできますが、それを壊してしまう可能性があります(おそらく、保存する必要があるいくつかの前提条件があります)。
  • なぜEntityManagerフィールドtransientですか?それは重要ですか?

答えて

0

私は完全にあなたに同意する、コードは非常に疑わしいと思われる。

DAOとSpringで@TransactionalでEntityManagerを使用する通常の方法は、http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/dao.htmlhttp://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.htmlで完全に説明されていますが、これはなぜRoo生成コードで異なるのかわかりません。

関連する問題