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