【问题标题】:Database IDs incrementing by more than one数据库 ID 递增超过 1
【发布时间】:2013-04-19 11:33:04
【问题描述】:

为了将我的 grails 数据库保存到文件而不是内存中,我刚刚将 grails 应用程序中的数据源更改为:

development {
    dataSource {
        dbCreate = "update" // one of 'create', 'create-drop', 'update', 'validate', ''
        url = "jdbc:h2:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000"
    }
}

如在线教程所示。

但是,当我创建一个User 对象并将其保存到数据库时,它可能有一个id,比如1。如果我做一些其他操作然后创建另一个User 对象被赋予ID,例如14,但绝不是2

我知道这可能与 Hibernate 为对象创建 ID 而与域类无关?

有没有办法让 id 对域来说是唯一的?

【问题讨论】:

  • 您所说的“域独有”是什么意思?
  • 所以当 user 对象被添加时,这些对象被分配了 ID,例如 1,2,3,4... 而不是创建 user,被分配 ID 1,然后是 @ 987654333@ 正在创建并被分配 2,另一个 user 正在添加,将被分配 ID 3 等等
  • 嗯,序列通常不保证增量总是一个。这个问题是相关的:stackoverflow.com/questions/7171626/…stackoverflow.com/questions/8333998/…
  • 请分享您的域类定义。
  • 默认情况下,hibernate 为所有 id 生成一个序列。您可以为映射闭包中的每个类指定一个单独的序列(参见凯利的答案)

标签: hibernate grails


【解决方案1】:

正如 Elias 所说,如果您使用数据库序列,您可能无法保证它们绝对是连续的。在某些数据库(如 Oracle)中,您可以通过设置 NOCACHE 或序列上的其他一些设置来稍微控制它。这仍然不能保证没有间隙,如果您有很多插入,它会影响性能。

您还可以为您关心此行为的域类设置不同的顺序。

class User {
    static mapping = {
        id generator: 'sequence', params:[sequence:'seq_user']
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    • 2020-01-13
    • 1970-01-01
    • 2016-01-13
    相关资源
    最近更新 更多