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

标签 java database google-app-engine transactions jdo

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

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

所以我编写了下面的方法来模拟为我的订单模型生成数据库序列。但我不确定这里需要配置什么事务状态(隔离级别/非事务性读取/非事务性写入/乐观/等 ):

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

最佳答案

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

关于java - 如何配置 JDO 事务来模拟在 App Engine Java 中创建数据库序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3817629/

相关文章:

java - 删除数据库中的行

sql - 我需要什么索引?

java - 延迟任务响应

java - 在 GAE 上解析完全有效的 XML 时出现 "Content is not allowed in prolog"

Java : Getting the next child node with SAXParser

java - 谷歌数据流: PCollection<String> to PCollection<TableRow> for BigQuery insertion

java - 用Java解析xml(获取可选的子节点值)

mysql - 一个查询中较大的结果集*和*总结果集计数的分页 block ?

python - Google App Engine 在 Flex 环境中推送任务超时

java - JGIT - 获得每一个授权的私有(private)项目