Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql hibernate如何填充自动生成字段的ID?_Sql_Database_Hibernate_Orm - Fatal编程技术网

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

Sql hibernate如何填充自动生成字段的ID?,sql,database,hibernate,orm,Sql,Database,Hibernate,Orm,假设我有一个具有自动生成主键的实体。现在,如果我尝试使用所有其他字段的值保存实体,这些字段可能不是唯一的。 实体将自动填充插入行的id。它是如何获得主键值的 编辑: 如果主键列是identity列,其值完全由数据库决定。因此,它在没有列值的情况下执行insert语句,db决定要使用的值。它是否会将其决定传达回它的决定(我不这么认为)Hibernate文档的部分描述了ID的自动生成。通常,自动生成策略用于实现最大的可移植性,并且假设您使用注释来提供域元数据,您可以按如下方式对其进行配置: @Id

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

编辑:

如果主键列是identity列,其值完全由数据库决定。因此,它在没有列值的情况下执行insert语句,db决定要使用的值。它是否会将其决定传达回它的决定(我不这么认为)

Hibernate文档的部分描述了ID的自动生成。通常,自动生成策略用于实现最大的可移植性,并且假设您使用注释来提供域元数据,您可以按如下方式对其进行配置:

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

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

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

Hibernate根据jdbc驱动程序支持的内容或使用的方言,使用三种方法提取DB自动生成字段

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

  • 使用方法语句。getGeneratedKeys(javadocs)

  • 直接从insert语句插入和选择生成的字段值。(Javadocs)

  • 在插入后执行select语句以检索生成的标识值

  • 所有这些都是由hibernate在内部完成的


    希望这是您想要的解释。

    太好了,但我的问题是,这是一个标识列,其下一个值完全由DB决定,hibernate如何知道它更新的行具有主键值x。编辑了我的问题我不确定你到底是什么意思,但标识符的值将被传回,因为它将在你插入的域实例上设置。数据库用于id的值也取决于数据库类型。Oracle将使用序列、MySQL和自动递增值等。正是我想要的谢谢。但是我没有真正得到第三点。它如何使用select语句获取标识值?给定行值除了生成的值之外不是唯一的,它是特定于您使用的方言的函数。选择不是基于域对象中字段的组合。Mysql使用“选择最后一个插入ID()”(参见[link]()