我设计了一个表(在postgres中),其中'id'列通过其SEQUENCE实体自动增加。 但是当我开始使用hibernate时,我遇到了问题....由于创建了insert语句,它使用了以下语句
INSERT INTO mytable(id,name)VALUE(0,'blablabla')
...
但是我希望它能像那样思考:
INSERT INTO mytable(name)VALUE('blablabla')
... Postgres必须自动生成id(至少当我用sql编辑器运行这样的脚本时,它起作用了)
我相信它可以配置,但我不知道如何......
这是我的.hbm.xml的一部分:
<hibernate-mapping>
<class name="com.cse.database.bean.Category" table="category">
<id name="id" type="int">
<column name="id" />
<generator class="assigned" />
</id>
<property name="name" type="string">
<column name="name" length="100" not-null="true" unique="true" />
</property>
</class>
</hibernate-mapping>
答案 0 :(得分:2)
当您指定<generator>
时,您告诉Hibernate如何创建ID。 assigned
表示您的应用程序正在执行此操作(您不需要)。您可以指定Hibernate类甚至应用程序类来执行它,您也不需要它。 identity
表示数据库为您执行此操作,这正是您想要的。在某些数据库中,您可以使用sequence
(它将查询序列生成器以获取ID,然后写入记录),Hibernate允许您使用native
来指定最适用于您的数据库。
<id name="id" type="int">
<column name="id" />
<generator class="identity" />
</id>
显然适用于这种情况。
答案 1 :(得分:1)
assigned
表示你明确指定实体的ID,但实际情况并非如此。 postgreSQL,AFAIK中这些自动生成的ID的问题在于,它不可能获得最后生成的ID,并且Hibernate在插入后无法获得分配给实体的ID。您不应该在PostgreSQL中使用自动生成的ID。
相反,让Hibernate使用序列生成器并在插入之前将ID分配给实体:
@SequenceGenerator(name = "FOO_SEQ", sequenceName = "FOO_SEQ")
public class Foo {
@Id
@GeneratedValue(generator = "FOO_SEQ")
@Column(name = "FOO_ID")
private Long id;