了解Spring Roo为GWT生成的实体代码

时间:2012-05-07 13:17:34

标签: gwt jpa spring-roo entitymanager

我们正在研究由Spring Roo生成的GWT项目,但我们不再使用Roo来编辑/生成类。相反,我们现在手动编写所有内容。

对于每个服务器端实体,classe 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);
}

我的观察和问题:

  • 实例方法使用Spring注入的EntityManager字段,这很清楚。但为什么这篇文章是:if(entityManager == null) entityManager = entityManager();?我们不应该怀疑EntityManager字段中的em是否应该被注入而不能是null(否则出现问题?)
  • 静态方法创建实体的新实例并获取其EntityManager字段,为什么?无法在静态字段中缓存EntityManager或类似的东西?
  • 为什么阅读findAllXXX等方法不是@Transictional?据我所知,根据JPA规范,所有JPA操作都应该在事务的边界内完成?
  • if (id == null) return null;方法findXXX方法真的有必要吗?如果我们将id参数作为空来表示出现问题,我们是否应该崩溃应用程序?
  • 我们能否以更优雅的方式重写这个EntityManager获取代码(例如,没有那些奇怪的new Entity().entityManager内容)但是没有打破它(可能有一些前提条件需要保留)?
  • 为什么EntityManager字段为transient?这很重要吗?

1 个答案:

答案 0 :(得分:0)

我完全同意你的看法,代码看起来非常可疑。

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中完全解释了在DAO中使用EntityManagers和在Spring中使用@Transactional的常用方法,我不明白为什么这对于Roo生成的代码应该有所不同。< / p>