Spring GeneratedValue注释用法

时间:2017-12-06 14:16:00

标签: spring jpa entity

我们说我有一个Car实体:

@Entity 
public class Car {
      @Id
      @GeneratedValue(strategy=GenerationType.AUTO)
      private Integer id;

当我向数据库添加新对象时,spring如何知道自动增量的值是什么?

1 个答案:

答案 0 :(得分:1)

这是good explanation of primary keys generation strategies

  

有4个选项可用于生成主键

     

GenerationType.AUTO

     

GenerationType.AUTO是默认生成类型并允许   持久性提供者选择生成策略。

     

如果您使用Hibernate作为持久性提供程序,它会选择一个   基于数据库特定方言的生成策略。对于大多数   热门数据库,选择GenerationType.SEQUENCE

     

GenerationType.IDENTITY

     

GenerationType.IDENTITY是最简单,但不是最好的   从绩效的角度来看。它依赖于自动递增   数据库列,让数据库为每个数据库生成一个新值   插入操作。从数据库的角度来看,这非常有效,因为自动增量列经过了高度优化,并且不需要任何其他语句。

     

如果使用Hibernate,这种方法有一个明显的缺点。   Hibernate需要每个被管实体的主键值   因此必须立即执行insert语句。这个   阻止它使用不同的优化技术,如JDBC   配料。

     

GenerationType.SEQUENCE

     

GenerationType.SEQUENCE使用数据库序列生成   独特的价值观它需要额外的select语句来获取   数据库序列中的下一个值。但这没有表现   对大多数应用程序的影响

     

如果您不提供任何其他信息,Hibernate会   请求默认序列中的下一个值。你可以改变它   通过引用生成器中@SequenceGenerator的名称   @GeneratedValue注释的属性。 @SequenceGenerator   注释允许您定义生成器的名称,名称和   数据库序列的模式和分配大小   序列

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@SequenceGenerator(name="car_generator", sequenceName = "car_seq", allocationSize=50)
private Long id;

(旁注:对于ids而不是Long,通常更喜欢Integer,因此您不太可能用完

  

GenerationType.TABLE

     

GenerationType.TABLE得到现在很少使用。它模拟   通过在数据库中存储和更新其当前值来实现的序列   需要使用悲观锁的表格   交易成顺序。这会减慢你的速度   应用程序,因此,您应该更喜欢   GenerationType.SEQUENCE ,如果您的数据库支持序列,则   最受欢迎的数据库。

相关问题