我们正在研究由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);
}
我的观察和问题:
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
?这很重要吗?答案 0 :(得分:0)
我完全同意你的看法,代码看起来非常可疑。
在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中完全解释了在DAO中使用EntityManagers和在Spring中使用@Transactional的常用方法,我不明白为什么这对于Roo生成的代码应该有所不同。< / p>