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