4

によって生成された GWT プロジェクトに取り組んでいますが、クラスの編集/生成にSpring Rooは使用しなくなりました。Roo代わりに、すべてを手動で記述します。

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();? EntityManagerin emfield を注入する必要があり、注入できないことを期待していませんnullか (または、何か問題がありますか?)。
  • 静的メソッドがエンティティの新しいインスタンスを作成し、そのEntityManagerフィールドを取得するのはなぜですか? 静的フィールドなどにキャッシュできませんでしEntityManagerたか?
  • findAllXXXare notのようなメソッドを読むのはなぜ@Transictionalですか?私が知っていることから、JPA仕様によると、すべてのJPA操作はトランザクションの境界内で行う必要がありますか?
  • if (id == null) return null;ピースインfindXXXメソッドは本当に必要ですか?id何か問題があることを示すためにパラメーターとして null を取得した場合、むしろアプリケーションをクラッシュさせるべきではありませんか?
  • このEntityManager取得コードをより洗練された方法で (たとえば、その奇妙なnew Entity().entityManagerものを使用せずに) 書き直すことができますか?
  • EntityManagerフィールドはなぜtransientですか?それは重要ですか?
4

1 に答える 1

0

私はあなたに完全に同意します。コードは非常に疑わしいようです。

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

于 2012-05-07T14:53:40.750 に答える