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

时间:2012-07-02 19:05:15

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

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

alter table user alter column int not null auto_increment;
这个常见的甚至不起作用。是否有任何JPA for auto_incement的注释可能?

非常感谢

2 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:3)

我遇到了同样的问题。我不确定根本原因是否相同。但这转变为完全合乎逻辑的解释。所以这就是我发现的。

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

第一种方式:(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>

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