此语法不会在不同的提取组中生成唯一的值:
@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/