【问题标题】:How to configure a JDO transaction to simulate creating a database sequence in App Engine Java?如何配置 JDO 事务以模拟在 App Engine Java 中创建数据库序列?
【发布时间】:2011-04-18 13:45:16
【问题描述】:

此语法不会在不同的 Fetch Groups 中产生唯一值:

@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private long id;

所以我编写了下面的方法来模拟为我的订单模型生成数据库序列。但我不确定的是事务状态需要在这里配置什么 (isolation level / nontransactional read / nontransactional write / optimistic / etc.)

public long getNextId()
{
    PersistenceManager pm = this.getPm();
    Transaction tx = pm.currentTransaction();
    tx.begin();
    long nextId = 0;
    Query query = pm.newQuery("select id from orders order by id desc");
    query.setRange(0, 1);
    try
    {
        List<Order> results = (List<Order>) query.execute();
        if (results.iterator().hasNext())
        {
            for (Order r : results)
            {
                nextId = r.getId() + 1;
            }
        }
        else
        {
            return 0;
        }
    }
    catch (Exception e)
    {
        return 0;
    }
    tx.commit();
    return nextId;
}

交易的范围是否需要比这种方法更广泛?换句话说,它是否还应该包括新订单的插入操作?

我想确保我插入的两个订单不能在整个应用程序中具有相同的 id 值。

【问题讨论】:

    标签: java database google-app-engine transactions jdo


    【解决方案1】:

    使用 IdGeneratorStrategy.SEQUENCE 生成的 ID 对于具有相同父级的所有实体都是唯一的。如果您的实体是根实体(例如,没有父实体),那么它们都将获得唯一的 ID。您有子实体但需要所有子实体的唯一 ID 的用例是什么?

    【讨论】:

    • 在像这样的问答网站中,我希望所有问题在整个应用程序中都有一个唯一的 id,以便在问题 url 中使用(stackoverflow.com/questions/3817629/hwo-to-configure):这里的唯一问题 id 是 3817629 . 问题的父实体是写问题的用户,但如果序列是唯一的,如您所说,那么将有 id 重叠,它们将无法用于为问题生成唯一 url .不过,您的解释是有道理的:我认为问题出在 JDO Fetch Groups 上,而实际上是实体组。
    • 为什么不直接将问题设为根实体,并为发布问题的用户提供 ReferenceProperty,而不是将它们设为子实体?
    • 不知道为什么我没有想到这一点。我只是自然地将它们视为子实体。但我想他们不需要。谢谢。
    【解决方案2】:

    IdGeneratorStrategy.SEQUENCE 有什么问题?因为 GAE/J 声称支持它

    【讨论】:

    • IdGeneratorStrategy.IDENTITY 一样,序列在各个提取组中是唯一的,但在整个应用程序中是唯一的。
    • 我认为您的意思是实体组(GAE/J BigTable 概念)。 FetchGroup 是使用 JDO 检索时使用的一组字段。如果他们的序列在整个应用程序中不是唯一的,那么请他们修复它(或者至少是一个选项)
    • 是的,你是对的。在阅读尼克约翰逊的回复后,我可以看到我误解了问题的根源,这实际上是实体组问题而不是 Fetch Group 问题。至少这是某种进步。
    猜你喜欢
    • 2012-06-22
    • 2012-06-04
    • 2011-07-03
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多