【问题标题】:Query does not find persisted object in same transaction查询未在同一事务中找到持久对象
【发布时间】:2013-03-09 17:23:07
【问题描述】:

我的域对象看起来像这样:

@PersistenceCapable(detachable="true")
public class UserData implements java.io.Serializable
{
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long id;

    @Persistent
    @NotNull
    private String openId;

    public UserData(String openId)
    {
        this.openId = openId;
    }
}

现在我创建一个 UserData 对象并使用 JDO 使其持久化:

UserData userData = ThreadLocalPMF.getPersistenceManager().makePersistent(new UserData(openId));

稍后在代码中,我使用相同的 PersistenceManager、相同的线程在同一个仍处于打开状态的事务中进行查询:

Query query = ThreadLocalPMF.getPersistenceManager().newQuery(UserData.class, "openId == :openId");
query.setUnique(true);
UserData userData = (UserData)query.execute(openId);

现在发生了一次查询确实返回了 null 而不是之前在几行代码中持久化的对象。这里有什么问题?这是一个一致性问题吗?该应用正在使用 High Replication Datastore 与

<property name="datanucleus.appengine.datastoreEnableXGTransactions" value="true"/>

【问题讨论】:

    标签: google-app-engine transactions persistence jdo


    【解决方案1】:

    当持久化带有 id 变量标记的对象时:

    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    

    目前我不能 100% 确定它是否会使用提供的 ID 保存对象。但我认为它会使用完全不同的 ID 值保存对象,因为它遵循 valueStrategy

    要解决这个问题,保存对象后,在从方法返回之前获取它的 ID,保留 ID 以便以后查找对象。

    【讨论】:

      【解决方案2】:

      在 GAE 事务中,事务中的所有查询都会在事务开始时看到数据存储状态的快照。查询不会返回在事务中修改的任何新的或更新的实体,您必须自己跟踪。

      您应该返回事务查询的文档以获取更多详细信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-20
        • 2011-08-06
        • 1970-01-01
        • 2012-03-12
        • 1970-01-01
        • 2018-09-30
        • 1970-01-01
        • 2011-05-25
        相关资源
        最近更新 更多