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);
}

我的观察和问题:

  • 实例方法使用EntityManagerSpring 注入的字段,这很清楚。但为什么这件作品用于:if(entityManager == null) entityManager = entityManager();?难道我们不期望EntityManagerem现场应该被注入并且不能被注入null(或者有什么问题吗?)
  • 静态方法创建实体的新实例并获取其EntityManager字段,为什么?不能EntityManager缓存在静态字段或类似的东西中?
  • 为什么 read 方法就像findAllXXXare not @Transictional?据我所知,根据 JPA 规范,所有 JPA 操作都应该在事务边界内完成?
  • 分段方法真的有必要吗if (id == null) return null;findXXX如果我们得到 null 作为id参数来表明有问题,我们不应该让应用程序崩溃吗?
  • 我们能否以更优雅的方式重写这个EntityManager获取代码(例如,没有那些奇怪的new Entity().entityManager东西)但不破坏它(可能需要保留一些先决条件)?
  • 为什么是EntityManager字段transient?那很重要吗?
4

1 回答 1

0

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

在http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/dao.htmlhttp:/中完美解释了在 DAO 中使用 EntityManager 和使用 Spring 使用 @Transactional 的常用方法/static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html,我不明白为什么这对于 Roo 生成的代码应该有所不同。

于 2012-05-07T14:53:40.750 回答