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看起来有效.你能发布错误信息吗?
我有同样的问题。我不确定根本原因是否相同。但是,有一个完全合乎逻辑的解释。这就是我发现的。
首先,至少有2种不同的方法来创建自动递增的密钥。
如果使用包含类信息的基于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)
该表已被破坏并重新生成。