【问题标题】:java hibernate skip insert 'id' on insertjava hibernate在插入时跳过插入'id'
【发布时间】:2012-01-31 22:59:24
【问题描述】:

我设计了一个表(在 postgres 中),其中“id”列通过其 SEQUENCE 实体自动递增。 但是当我开始使用hibernate时我遇到了问题....由于创建了插入语句,它使用了follow语句

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>

【问题讨论】:

  • 重要的是它是 PostgreSQL。当您指定 &lt;generator&gt; 时,您是在告诉 Hibernate 如何创建 ID。 assigned 表示您的应用程序正在执行此操作(您不希望这样做)。 identity 表示数据库会为你做这件事,这 你想要的,但 docs.jboss.org/hibernate/core/3.3/reference/en/html/… 没有将 PostgreSQL 列为支持它。也许sequence 可以与 PostgreSQL 一起使用?你也可以使用native,它会自动工作......
  • 似乎将生成器设置为“身份”解决了我的问题:) 你能把你的消息作为答案发布,我会接受它
  • 完成。不确定identity 是否适用于 PostgreSQL,因为 Hibernate 文档没有列出该数据库。

标签: java hibernate postgresql


【解决方案1】:

当您指定 &lt;generator&gt; 时,您是在告诉 Hibernate 如何创建 ID。 assigned 表示您的应用程序正在执行此操作(您不希望这样做)。您可以指定一个 Hibernate 类甚至是一个应用程序类来执行此操作,这也是您不想要的。 identity 表示数据库为您完成,这就是您想要的。在某些数据库中您可以使用sequence(它将查询序列生成器以获取ID,然后写入记录),Hibernate 允许您使用native 来指定最适合您的数据库。

    <id name="id" type="int">
        <column name="id" />
        <generator class="identity" />
    </id>

显然在这种情况下有效。

【讨论】:

    【解决方案2】:

    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;
    

    【讨论】:

    • >> 在 postgreSQL 中使用这些自动生成的 ID,AFAIK ..... 我不想获得最后生成的 id .. O 只是希望 Hibernate 不会尝试填充“id”由于插入数据的列
    • Hibernate 需要知道生成的 ID。如果没有 ID,Hibernate 就无法在会话中维护实体。如果不知道生成的实体 ID,Hibernate 将无法使用。
    猜你喜欢
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 2015-01-24
    • 2012-02-22
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多