我一直在查看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(最新版本)生成相同的代码
答案 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的专家,所以不能 甚至想到任何可能做的事情 这个。也许你应该发布更多 你的代码,特别是任何 非标准配置。随机 问题/思路:
- 您使用的是Hibernate提供程序还是?
- persisence-unit的任何自定义配置?
- 请参阅所有的Propagation.REQUIRES_NEW 你的实体坚持方法吗?
- 您在哪里看到传播注释。 (例如在 * _Entity.aj文件?)
- 醇>
您的实体类(或其父母之一)是否有可能 拥有它自己的.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。