hibernate如何填充自动生成字段的ID?

时间:2011-06-07 08:35:16

标签: sql database hibernate orm

假设我有一个带有自动生成主键的实体。现在,如果我尝试使用可能不唯一的所有其他字段的值保存实体。 实体将自动填充插入行的id。它是如何获得主键值的?

编辑:

如果主键列是标识列,其值完全由数据库决定。所以它执行一个没有该列值的insert语句,并且db决定要使用的值,它是否会回复它的决定(我不这么认为)

3 个答案:

答案 0 :(得分:7)

Hibernate使用三种方法来提取数据库自动生成的字段,具体取决于jdbc驱动程序或您正在使用的方言的支持。

Hibernate提取生成的字段值将其放回pojo中:

  1. 使用Statement.getGeneratedKeys(Statement javadocs)方法

  2. 直接从insert语句插入并选择生成的字段值。 (Dialect Javadocs)

  3. 在插入后执行select语句以检索生成的IDENTITY值

  4. 所有这些都是由hibernate内部完成的。

    希望它是您正在寻找的解释。

答案 1 :(得分:1)

Hibernate文档的

This部分描述了id的自动生成。通常,AUTO生成策略用于最大程度的可移植性,并假设您使用Annotations提供域元数据,您可以按如下方式配置它:

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long id;

无论如何,提供的链接应该提供生成的ID所需的所有细节。

答案 2 :(得分:0)

使用序列派生的代理主键创建对象时,将其传递给Hibernate会话,该字段设置为Hibernate解释为“未分配”的值,默认为0.此字段为在相应的记录未插入数据库表之前,未填充指定的值。您可以通过在hibernate会话上显式调用flush()或在同一会话中执行数据库读取来触发插入。之后,您可以检查该字段的值,它将被分配而不是0.