【问题标题】:how to set H2 primary key id to auto_increment?如何将 H2 主键 ID 设置为 auto_increment?
【发布时间】:2012-07-03 05:19:10
【问题描述】:

我正在使用 sql、H2,并且我正在尝试使 Usertable 的 ID 为 auto_incremented。我在 H2 sql 界面中尝试了所有 sql 命令,但没有成功。

alter table user alter column int not null auto_increment;

这个常见的甚至不起作用。是否有任何 JPA 的 auto_incement 注释可能是?

非常感谢

【问题讨论】:

    标签: sql jpa-2.0 playframework-2.0 auto-increment


    【解决方案1】:

    您应该使用 JPA 注释 @Id@GeneratedValue 作为您的 ID。

    您的 SQL 看起来有效。可以贴一下错误信息吗?

    【讨论】:

    • 没有错误信息,错误是key没有被auto_incremented。订单也算吗?我的意思是,@Id @Generatedvalue@GeneratedValue @Id 的影响不同?
    • 好吧,如果我按照您所说的那样添加这些注释,并且如果我尝试将数据保存到数据库中,它通常应该增加 ID 并与其他数据一起隐式保存到数据库中,对吗?但是现在,他说这个错误:[PersistenceException: Error getting sequence nextval] 但是一旦我在代码中手动设置了 ID,它就可以工作了,所以实际上是否可以让数据库增加 ID,这样我就不必手动设置它了?
    • orm.但现在它以某种方式工作,我将注释 @Id @GeneratedValue(strategy=GenerationType.IDENTITY) 现在它是 auto_incrementing。合理吗?
    • H2 默认使用数据库标识列自动递增。但我认为在使用@GeneratedValue 时会选择默认选项。如果情况属实,则无需设置策略IDENTITY
    • fyi,我遇到了与 OP 相同的问题,直到我添加 (strategy=GenerationType.IDENTITY)
    【解决方案2】:

    我遇到了同样的问题。我不确定根本原因是否相同。但后来出现了一个完全合乎逻辑的解释。这就是我的发现。

    首先,至少有 2 种不同的方法可以创建自增键。

    第一种方式:(xml)

    如果您使用包含类信息的基于 xml 的配置。 然后你可以在你的 classname.hbm.xml 文件中添加如下内容。

    <id name="id">
        <generator class="sequence"><param name="sequence">my_id_seq</param</generator>
    </id>
    

    要导入此文件,您的 hibernate.cfg.xml 文件中将包含以下内容:(或可能带有资源属性)

    <!--  Mapping files  -->
    <mapping file="classname.hbm.xml"/>
    

    但这里重要的是,现在实际上是 JAVA 将增加键。如果您检查了用于生成表的 sql,您会注意到它没有为 id 列保存自动递增的字段定义。

    第二种方式:(注解)

    一种完全不同的做事方式是将所有内容都放在注释中,就像您在问题中显示的那样。

    @GeneratedValue(strategy=GenerationType.IDENTITY)
    

    在您的 hibernate.cfg.xml 文件中,您将拥有如下内容:

    <!--  Mapping files  -->
    <mapping class="package.subpackage.MyClassName"/>
    

    GenerationType.IDENTITY 确实是默认值,因此您不必提供它本身。但无论如何,这次表格的生成方式会有所不同。即如下:

    CREATE CACHED TABLE PUBLIC.MYTABLENAME(
        ID INTEGER DEFAULT 
        (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_9DE2A0D5_28F5_488F_9E4C_2878B3CDA72F) 
        NOT NULL NULL_TO_DEFAULT SEQUENCE
        PUBLIC.SYSTEM_SEQUENCE_9DE2A0D5_28F5_488F_9E4C_2878B3CDA72F, 
    ...
    )
    

    啊哈!那很有意思。这一次序列生成不会由 JAVA 执行,而是由数据库自己执行。

    出了什么问题:

    当然,我们都在尝试和尝试。如果您首先决定使用 xml 文件,然后您最终决定使用注释。那么当然这意味着你也必须重新生成你的表。如果你忘记这样做,那么你会像 doniyor 那样得到错误。

    如何解决:

    只需将以下行添加到您的 hibernate.cfg.xml 并重新启动您的应用程序。

    <!-- Drop and re-create the database schema on startup -->
    <property name="hibernate.hbm2ddl.auto">create</property>
    

    表已被销毁并重新生成。

    【讨论】:

    • 设置strategy@GeneratedValue 为我解决了这个问题。默认为AUTO,但我相信H2需要IDENTITY
    猜你喜欢
    • 2012-07-02
    • 2020-08-25
    • 2019-06-20
    • 2011-03-21
    • 1970-01-01
    • 2011-02-11
    • 2011-10-24
    • 2010-10-31
    • 1970-01-01
    相关资源
    最近更新 更多