我正在使用sql,H2,而我正在努力使Usertable的ID为auto_incremented。我尝试在H2 sql界面中的所有sql命令,没有工作。
alter table user alter column int not null auto_increment;
这个常见的甚至不起作用。是否有任何JPA for auto_incement的注释可能?
非常感谢
答案 0 :(得分:10)
您应该使用JPA注释@Id
和@GeneratedValue
作为您的ID。
您的SQL看起来有效。你能发布错误信息吗?
答案 1 :(得分:3)
我遇到了同样的问题。我不确定根本原因是否相同。但这转变为完全合乎逻辑的解释。所以这就是我发现的。
首先,至少有两种不同的方法可以创建自动递增的密钥。
如果您使用包含类信息的基于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>
该表已被破坏并重新生成。