Hibernate:关于@GeneratedValue如何工作的概述

时间:2012-08-03 02:35:01

标签: hibernate

我很难找到对@GeneratedValue的准确解释,以及从数据库角度出发的不同策略。

是否始终查询数据库并返回最后一个值?如果2个不同的进程(不同的Hibernate应用程序)同时访问同一个表会发生什么?特别是使用自动数值和序列

3 个答案:

答案 0 :(得分:21)

我假设您正在引用JPA @GeneratedValue。

@GeneratedValue注释告诉ORM如何计算该字段的值。

例如:

 @Id
 @GeneratedValue(strategy=SEQUENCE, generator="CUST_SEQ")
 @Column(name="CUST_ID")
 public Long getId() { return id; }

 Example 2:

 @Id
 @GeneratedValue(strategy=TABLE, generator="CUST_GEN")
 @Column(name="CUST_ID")
 Long id;

要理解的关键是生成的值有一个策略,生成的值的策略决定了会发生什么。在上面的示例中,SEQUENCE生成策略意味着ORM将在第一次保存对象时向数据库询问序列的新值。第二个示例指定表生成策略,这意味着ORM将查询表中的行以确定id的值。在示例示例2中,没有显示使用哪个表的详细信息,因为它引用了一个名为“CUST_GEN”的生成器

您将遇到的典型发电机。

  • 标识 - 插入后,向自动启动列询问项目的值
  • 序列 - 值来自db序列
  • table - 值来自数据库中的另一个表
  • 自动 - 根据数据库类型选择上述之一
  • UUID - 在插入之前生成UUID

可以开发自定义发电机。与数据库的交互将取决于生成策略。

答案 1 :(得分:-3)

请使用http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/链接作为参考。但是,如果您要说明您正在寻找的具体内容,我可能会更好地帮助您。这里有关于@GeneratedValue注释的一些细节......我喜欢这篇关于同一主题http://elegando.jcg3.org/2009/08/hibernate-generatedvalue/的博文。他做得很好解释。

答案 2 :(得分:-3)

如果您在实体bean类中使用

@Id
@GeneratedValue
@Column(name="CUST_ID")
public Long getId() { return id; }

在这种情况下,Hibernate将确定将生成什么类型​​的主键,它取决于您使用的数据库。

默认情况下,@Id注释会自动确定要使用的最合适的主键生成策略,但您可以通过应用带有两个参数策略和生成器的@GeneratedValue注释来覆盖它。我不打算在这里讨论,所以让我们只使用默认的密钥生成策略。让Hibernate确定使用哪种生成器类型可以使代码在不同的数据库之间移植。