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
ですか?それは重要ですか?