我很难找到对@GeneratedValue的准确解释,以及从数据库角度出发的不同策略。
是否始终查询数据库并返回最后一个值?如果2个不同的进程(不同的Hibernate应用程序)同时访问同一个表会发生什么?特别是使用自动数值和序列
答案 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”的生成器
您将遇到的典型发电机。
可以开发自定义发电机。与数据库的交互将取决于生成策略。
答案 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确定使用哪种生成器类型可以使代码在不同的数据库之间移植。