【问题标题】:Wrong autoincrement value in sqlite using JPA使用 JPA 的 sqlite 中错误的自动增量值
【发布时间】:2013-12-13 18:32:09
【问题描述】:

我正在做一个使用 sqlite、JPA 和 eclipseLink 的简单项目。

首先我在我的数据库中创建我的Person 表:

CREATE TABLE Person ( 
idPerson  INTEGER PRIMARY KEY AUTOINCREMENT,
firstname      TEXT  DEFAULT 'NULL',
birthdate DATETIME        DEFAULT 'NULL'
)

然后添加一个新的测试条目(为了生成sqlite_sequence表)

INSERT INTO [Person] ([firstname], [birthdate]) VALUES ('Foo', '1145-11-12 00:00:00')

所有连续插入都是使用 JPA 完成的,在 Person 类中,我使用此符号表示人员 ID:

@GeneratedValue(generator="sqlite_person")
@TableGenerator(name="sqlite_person", table="sqlite_sequence",
    pkColumnName="name", valueColumnName="seq",
    pkColumnValue="Person")
@Column(name="idPerson")
private int id;

第一个 JPA 插入没问题(也就是说,新插入的新插入的人的 id = 2)但是我得到了 50 而不是只有 1 的增量(所以第三个插入的人的 id = 52,第四个 102 等等开)。

我读到“对此表进行修改可能会干扰 AUTOINCREMENT 密钥生成算法” [ref]

我的问题是否与此有关,即使理论上我没有修改该表? 有什么建议可以解决问题吗?

【问题讨论】:

    标签: sqlite jpa eclipselink


    【解决方案1】:

    您在数据库中使用自动增量,这意味着数据库将在插入 id 时为其分配一个值,但随后您告诉 JPA 提供程序使用表生成。表生成要求 JPA 提供程序使用特殊表来跟踪序列值,在将实体行插入数据库之前查找并分配它。这与您在数据库中设置的内容冲突。

    http://wiki.eclipse.org/EclipseLink/Examples/JPA/PrimaryKey 很好地解释了排序。您需要尝试使用 @GeneratedValue(strategy=GenerationType.IDENTITY) 而不是表生成,以便 JPA 的插入使用与 JPA 之外的插入相同的序列分配。

    【讨论】:

    • 感谢您的建议,但 IDENTITY 给了我一个独特的自动增量序列,在我的各个班级之间共享。还有一些与此策略相关的问题:see here
    【解决方案2】:

    最后,为了解决问题,我只是为TableGenerator注解添加了两个可选元素(即initialValueallocationSize)。
    所以新的ID注解是这样的:

    @GeneratedValue(generator="sqlite_person")
    @TableGenerator(name="sqlite_person", table="sqlite_sequence",
        pkColumnName="name", valueColumnName="seq",
        pkColumnValue="Person",
        initialValue=1, allocationSize=1)
    @Column(name="idPerson")
    private int id;
    

    我认为它在没有初始值的情况下也可以工作,但是像这样我也避免插入随机条目(因为在我创建 Person 表时似乎已经自动生成了 sqlite_sequence 表)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-06
      • 2017-03-07
      • 1970-01-01
      • 2015-06-08
      • 1970-01-01
      • 2014-05-08
      • 1970-01-01
      • 2015-05-11
      相关资源
      最近更新 更多