假设我有一个带有自动生成主键的实体。现在,如果我尝试保存该实体与所有其他字段的值,这些值可能不是唯一的。 该实体将自动填充插入行的id。它是如何获得该主键值的?
编辑:
如果主键列是标识列,其值完全由数据库决定,则它将执行不带该列值的插入语句,并由数据库决定要使用的值,但它没有回传这个决定(我认为不会)。
这个Hibernate文档部分描述了自动生成ID的过程。通常情况下,使用AUTO生成策略可以实现最大的可移植性,并且假设您使用注释来提供您的域元数据,您可以按照以下方式进行配置:
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long id;
无论如何,提供的链接应该为您提供有关生成ID所需的所有详细信息。
当您使用序列派生的代理主键创建对象时,将该字段设置为Hibernate默认解释为“未分配”的值(默认为0),并将其传递给Hibernate会话。在相应的记录未插入到数据库表中之前,此字段不会填充已分配的值。您可以通过在Hibernate会话上显式调用flush()或在同一会话中执行数据库读取来触发插入。之后,您可以检查该字段的值,它将被分配而不是0。