【问题标题】:Why does Spring Roo give persist() Propogation.REQUIRES_NEW为什么 Spring Roo 给 persist() Propogation.REQUIRES_NEW
【发布时间】:2011-02-01 22:08:18
【问题描述】:

我一直在查看 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(最新版本)生成相同的代码

【问题讨论】:

    标签: java jpa transactions spring-roo


    【解决方案1】:

    第二个答案(在将附加信息添加到问题后)

    这可能是由于使用了 GAE。 GAE 数据存储不使用传统的事务语义。参见 GAE 的事务隔离描述here。具体来说:

    查询并进入事务 保证看单, 数据存储的一致快照 截至开始 交易。 ...这一致 快照视图也扩展到读取 在事务内部写入之后。 与大多数数据库不同,查询 并进入数据存储区 交易看不到结果 以前写在里面 交易。具体来说,如果一个 实体在一个内被修改或删除 交易、查询或获得回报 实体的原始版本为 交易开始时, 如果实体不存在,则没有 那么。

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

    第一答案

    一定是有什么误会或者别的什么 玩。我刚刚检查了 Roo v1.1.1 生成一个简单的实体 Hibernate 提供程序和默认值 使用事务传播。这个 也在一定程度上得到了验证 documentation:

    所有持久化方法都已配置 使用 Spring 的事务支持 (传播。需要, 隔离。默认)。

    使用 Propagation.REQUIRES_NEW 会 对于默认持久化没有意义 方法。

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

    1. 您使用的是 Hibernate 提供程序还是?
    2. 持久性单元的任何自定义配置?
    3. 请查看所有的 Propagation.REQUIRES_NEW 你的实体持久化方法?
    4. 您在哪里看到传播注释。 (例如在 *_Entity.aj 文件?)
    5. 您的实体类(或其父母之一)是否有可能 有它自己的 .persist 方法(因此 覆盖 Roo 生成的方法)。

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

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

    【讨论】:

    • 添加了一些说明以解决您的问题。可能与 GAE/DN 有关,也可能是 Roo 错误。我只是想知道 REQUIRES_NEW 是否有充分的理由,因为它会对我的其他一些非 roo 项目产生影响。
    • 啊。我认为这很可能是由于使用了 GAE/DN 提供程序。我会相应地修改我的答案。同时,请在此处查看有关 GAE 事务隔离的说明:code.google.com/appengine/docs/java/datastore/transactions.html
    • 看来你是对的。 GAE 对事务的定义当然与 hibernate 不同。很高兴知道,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    相关资源
    最近更新 更多