gpt4 book ai didi

java - 为什么 Spring Roo 给 persist() Propogation.REQUIRES_NEW

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:39:03 26 4
gpt4 key购买 nike

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

最佳答案

第二个答案(在向问题添加额外信息之后)

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

Queries and gets inside a transaction are guaranteed to see a single, consistent snapshot of the datastore as of the beginning of the transaction. ... This consistent snapshot view also extends to reads after writes inside transactions. Unlike with most databases, queries and gets inside a datastore transaction do not see the results of previous writes inside that transaction. Specifically, if an entity is modified or deleted within a transaction, a query or get returns the original version of the entity as of the beginning of the transaction, or nothing if the entity did not exist then.

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

第一个答案

There must be a misunderstanding or something else at play. I just checked with Roo v1.1.1 generating a simple entity with Hibernate provider, and the default transaction propagation is used. This is also somewhat verified in the documentation:

All persistence methods are configured with Spring's Transaction support (Propagation.REQUIRED, Isolation.DEFAULT).

使用 Propagation.REQUIRES_NEW 会 对于默认的 persist 没有意义 方法。

我不是 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 .

关于java - 为什么 Spring Roo 给 persist() Propogation.REQUIRES_NEW,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4868527/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com