java hibernate在插入时跳过插入'id'

时间:2012-01-31 22:59:24

标签: java hibernate postgresql

我设计了一个表(在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>

2 个答案:

答案 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;