Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解SpringRoo为GWT生成的实体代码_Gwt_Jpa_Spring Roo_Entitymanager - Fatal编程技术网

理解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
    这样的读取方法不是
    @transitional
    ?据我所知,根据JPA规范,所有JPA操作都应该在事务边界内完成
  • 如果(id==null)返回null,则为
    插入
    findXXX
    方法真的有必要吗?如果我们得到null作为
    id
    参数来表示出现了问题,我们不应该让应用程序崩溃吗
  • 我们是否可以以更优雅的方式重写此
    EntityManager
    采集代码(例如,没有奇怪的
    new Entity().EntityManager
    东西),但不破坏它(可能需要保留一些先决条件)
  • 为什么
    EntityManager
    字段
    是瞬态的
    ?这重要吗

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

      在DAOs和@Transactional with Spring中使用EntityManager的常用方法在和中得到了完美的解释,我不明白为什么这对于Roo生成的代码应该有所不同