9

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

alter table user alter column int not null auto_increment;

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

多谢

4

2 回答 2

14

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

您的 SQL 看起来有效。您可以发布错误消息吗?

于 2012-07-02T21:18:09.083 回答
7

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

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

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

该表已被销毁并重新生成。

于 2013-07-11T12:50:17.430 回答