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

Posted

技术标签:

【中文标题】java hibernate在插入时跳过插入\'id\'【英文标题】: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 文档没有列出该数据库。 【参考方案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 将无法使用。

以上是关于java hibernate在插入时跳过插入'id'的主要内容,如果未能解决你的问题,请参考以下文章

在 clickhouse 中加载数据时跳过 csv 标头

导入 CSV 时跳过标题或第一行

如何在JPA / JAVA / Hibernate的两列中插入自动生成的ID

Java JPA Hibernate保存不插入引用的实体

分类时跳过特征,但在输出中显示特征

在mysql中的重复条目上跳过插入