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