理解SpringRoo为GWT生成的实体代码
我们正在处理由理解SpringRoo为GWT生成的实体代码,gwt,jpa,spring-roo,entitymanager,Gwt,Jpa,Spring Roo,Entitymanager,我们正在处理由springroo生成的GWT项目,但我们不再使用Roo来编辑/生成类。相反,我们现在手动编写所有内容 对于每个服务器端实体类,Roo生成了非常奇怪的EntityManageracquisition代码。而且必须维护它,我想很好地理解它,但我没有。以下是生成的实体代码的片段: @PersistenceContext transient EntityManager entityManager; public static final EntityManager entityMana
springroo
生成的GWT项目,但我们不再使用Roo
来编辑/生成类。相反,我们现在手动编写所有内容
对于每个服务器端实体类,Roo生成了非常奇怪的EntityManager
acquisition代码。而且必须维护它,我想很好地理解它,但我没有。以下是生成的实体代码的片段:
@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);
}
@PersistenceContext
瞬态实体管理器;
公共静态最终EntityManager EntityManager(){
EntityManager em=新方案().EntityManager;
if(em==null)
抛出新的非法状态异常(
“实体管理器尚未注入(Spring方面JAR是否配置为AJC/AJDT方面库?);
返回em;
}
@交易的
公共图书馆{
if(entityManager==null)
entityManager=entityManager();
entityManager.persist(这个);
}
公共静态列表findAllScenarios(){
List res=entityManager().createQuery(
“从场景o中选择o按o.name排序”,
Scenario.class.getResultList();
返回res;
}
公共静态场景findScenario(长id){
if(id==null)
返回null;
返回entityManager().find(Scenario.class,id);
}
我的意见和问题:
- 实例方法使用Spring注入的
字段,这一点非常清楚。但为什么这篇文章是针对:EntityManager
if(entityManager==null)entityManager=entityManager()代码>?我们不认为
字段中的em
应该被注入,并且不能为EntityManager
(否则会出错吗?)null
- 静态方法创建实体的新实例并获取其
字段,为什么?不能将EntityManager
缓存在静态字段或类似的内容中EntityManager
- 为什么像
这样的读取方法不是findAllXXX
?据我所知,根据JPA规范,所有JPA操作都应该在事务边界内完成@transitional
- 如果(id==null)返回null,则为
代码>插入
方法真的有必要吗?如果我们得到null作为findXXX
参数来表示出现了问题,我们不应该让应用程序崩溃吗id
- 我们是否可以以更优雅的方式重写此
采集代码(例如,没有奇怪的EntityManager
东西),但不破坏它(可能需要保留一些先决条件)new Entity().EntityManager
- 为什么
字段EntityManager
?这重要吗是瞬态的
- 我完全同意你的看法,代码看起来很可疑
在DAOs和@Transactional with Spring中使用EntityManager的常用方法在和中得到了完美的解释,我不明白为什么这对于Roo生成的代码应该有所不同