如何将H2主键id设置为auto_increment?

don*_*yor 6 sql auto-increment jpa-2.0 playframework-2.0

我正在使用sql,H2,我正在努力使Usertable的ID为auto_incremented.我尝试在H2 sql界面中的所有sql命令,没有工作.

alter table user alter column int not null auto_increment;
Run Code Online (Sandbox Code Playgroud)

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

非常感谢

Leo*_*unt 11

您应该使用JPA注释@Id@GeneratedValue您的ID.

您的SQL看起来有效.你能发布错误信息吗?

  • Orm。但现在它以某种方式起作用,我将注释``@Id @GeneratedValue(strategy = GenerationType.IDENTITY)``现在是auto_incrementing。合理吗? (4认同)

bvd*_*vdb 6

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

首先,至少有2种不同的方法来创建自动递增的密钥。

第一种方式:(xml)

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

<id name="id">
    <generator class="sequence"><param name="sequence">my_id_seq</param</generator>
</id>
Run Code Online (Sandbox Code Playgroud)

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

<!--  Mapping files  -->
<mapping file="classname.hbm.xml"/>
Run Code Online (Sandbox Code Playgroud)

但重要的是,实际上是JAVA会增加密钥。如果您已经检查了用于生成表的sql,则会注意到它没有为id列保留自动递增的字段定义。

第二种方式:(注释)

完全不同的处理方式是将所有内容放入注释中,就像您在问题中所显示的那样。

@GeneratedValue(strategy=GenerationType.IDENTITY)
Run Code Online (Sandbox Code Playgroud)

在您的hibernate.cfg.xml文件中,您将看到以下内容:

<!--  Mapping files  -->
<mapping class="package.subpackage.MyClassName"/>
Run Code Online (Sandbox Code Playgroud)

实际上,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, 
...
)
Run Code Online (Sandbox Code Playgroud)

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

什么地方出了错:

我们所有人都在尝试并尝试一些不合时宜的事情。如果您首先决定使用xml文件,然后再决定使用批注。然后,这当然意味着您还必须重新生成表。如果您忘记这样做,那么您将像doniyor一样得到错误。

解决方法:

只需将以下行添加到hibernate.cfg.xml中,然后重新启动应用程序即可。

<!-- Drop and re-create the database schema on startup -->
<property name="hibernate.hbm2ddl.auto">create</property>
Run Code Online (Sandbox Code Playgroud)

该表已被破坏并重新生成。