为什么Spring Roo会坚持()Propogation.REQUIRES_NEW

时间:2011-02-01 22:08:19

标签: java jpa transactions spring-roo

我一直在查看Spring Roo生成的代码,我注意到它创建的persist()方法被赋予Propagation.REQUIRES_NEW。默认传播不足够吗?

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void Entity.persist() {
    if (this.entityManager == null) this.entityManager = entityManager();
    this.entityManager.persist(this);
}

一些其他信息。以下是生成此代码的roo日志:

// Spring Roo 1.1.0.RELEASE [rev 793f2b0] log opened at 2011-02-04 10:01:02
project --topLevelPackage org.sotest.sscce --projectName Test --java 6
// Spring Roo 1.1.0.RELEASE [rev 793f2b0] log closed at 2011-02-04 10:01:04
// Spring Roo 1.1.0.RELEASE [rev 793f2b0] log opened at 2011-02-04 10:01:06
persistence setup --database GOOGLE_APP_ENGINE --provider DATANUCLEUS
entity --class ~.entities.Entity
exit
// Spring Roo 1.1.0.RELEASE [rev 793f2b0] log closed at 2011-02-04 10:02:55

我正在使用带有DN提供程序的GAE数据库。我只是创建了一个实体,除了发出上述roo命令之外,我没有触及任何文件。当我打开Entity_Roo_Entity.aj时,我得到了上面的代码。

我将在最新版本的Roo上再试一次并验证相同的输出。我还将在与Roo相关的论坛上发布此问题。

更新:使用Roo 1.1.1(最新版本)生成相同的代码

1 个答案:

答案 0 :(得分:2)

第二个答案(在问题中添加了其他信息之后)

这可能是由于使用了GAE。 GAE数据存储区不使用传统的事务语义。请参阅GAE的事务隔离here的说明。具体做法是:

  

查询并进入交易   保证看到一个,   数据存储的一致快照   截至开头   交易。 ......这一致   快照视图也扩展到读取   写入内部交易后。   与大多数数据库,查询不同   并进入数据存储区   交易看不到结果   之前写的内容   交易。具体来说,如果是   实体在a中被修改或删除   事务,查询或获取返回   该实体的原始版本为   在交易开始时,   如果实体不存在则不执行任何操作   然后

还有restrictions on querying within a transaction。考虑到这一点,可能会添加REQUIRES_NEW,以便“第一个”事务中实体的任何后续读取按预期工作。似乎令人困惑和不标准,但也许这是在GAE约束下工作的最佳选择。

第一个答案

  

必定存在误解或其他问题   玩。我刚刚检查过Roo v1.1.1   生成一个简单的实体   Hibernate提供程序,默认   使用事务传播。这个   也有点验证了   documentation

     
    

配置所有持久性方法     有了Spring的交易支持     (Propagation.REQUIRED,     Isolation.DEFAULT)。

  
     

使用Propagation.REQUIRES_NEW会   没有意义的默认持久性   方法

     

我不是Roo的专家,所以不能   甚至想到任何可能做的事情   这个。也许你应该发布更多   你的代码,特别是任何   非标准配置。随机   问题/思路:

     
      
  1. 您使用的是Hibernate提供程序还是?
  2.   
  3. persisence-unit的任何自定义配置?
  4.   
  5. 请参阅所有的Propagation.REQUIRES_NEW   你的实体坚持方法吗?
  6.   
  7. 您在哪里看到传播注释。 (例如在   * _Entity.aj文件?)
  8.   
  9. 您的实体类(或其父母之一)是否有可能   拥有它自己的.persist方法(因此   重写Roo生成的方法)。

         

    1:   http://static.springsource.org/spring-roo/reference/html/base-persistence.html

  10.   

1:啊。我认为很可能是因为使用了GAE / DN提供商。我会相应地修改我的答案。在此期间,请查看有关GAE事务隔离的说明:http://code.google.com/appengine/docs/java/datastore/transactions.html