我正在使用 sql,H2,并且我正在尝试使 Usertable 的 ID 为 auto_incremented。我在 H2 sql 界面中尝试了所有 sql 命令,但没有成功。
alter table user alter column int not null auto_increment;
这个常见的甚至不起作用。是否有任何 JPA 的 auto_incement 注释可能是?
多谢
我正在使用 sql,H2,并且我正在尝试使 Usertable 的 ID 为 auto_incremented。我在 H2 sql 界面中尝试了所有 sql 命令,但没有成功。
alter table user alter column int not null auto_increment;
这个常见的甚至不起作用。是否有任何 JPA 的 auto_incement 注释可能是?
多谢
您应该使用 JPA 注释@Id
和@GeneratedValue
您的 ID。
您的 SQL 看起来有效。您可以发布错误消息吗?
我有同样的问题。我不确定根本原因是否相同。但后来出现了一个完全合乎逻辑的解释。所以这就是我发现的。
首先,至少有两种不同的方法来创建自动递增的键。
如果您使用包含类信息的基于 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>
该表已被销毁并重新生成。