如何配置JDO事务以模拟在App Engine Java中创建数据库序列?

时间:2010-09-28 22:59:37

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

此语法不会在不同的提取组中生成唯一值:

@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值。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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