Spring GeneratedValue注解用法

web*_*nce 8 spring entity jpa

假设我有一个Car实体:

@Entity 
public class Car {
      @Id
      @GeneratedValue(strategy=GenerationType.AUTO)
      private Integer id;
Run Code Online (Sandbox Code Playgroud)

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

mro*_*man 15

这是主键生成策略的一个很好的解释

有 4 个选项可以生成主键

生成类型.AUTO

GenerationType.AUTO 是默认的生成类型,让持久化提供者选择生成策略。

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

生成类型.IDENTITY

GenerationType.IDENTITY 是最容易使用的,但从性能的角度来看并不是最好的。它依赖于一个自动递增的数据库列,并让数据库在每次插入操作时生成一个新值。从数据库的角度来看,这是非常高效的,因为自增列是高度优化的,不需要任何额外的语句。

如果您使用 Hibernate,这种方法有一个明显的缺点。Hibernate 需要每个托管实体的主键值,因此必须立即执行插入语句。这可以防止它使用不同的优化技术,如 JDBC 批处理。

生成类型.SEQUENCE

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

如果您不提供任何附加信息,Hibernate 将从其默认序列中请求下一个值。您可以通过@SequenceGenerator@GeneratedValue注释的生成器属性中引用 a 的名称来更改它。该@SequenceGenerator 注释允许您定义发电机,名称和架构的数据库序列和序列的分配大小的名称。

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

(旁注:通常更喜欢Longids 而不是Integer这样你不太可能用完)

生成类型表

GenerationType.TABLE现在很少使用。它通过在数据库表中存储和更新其当前值来模拟序列,这需要使用悲观锁将所有事务按顺序排列。这会减慢您的应用程序的速度,因此您应该更喜欢 GenerationType.SEQUENCE,如果您的数据库支持序列,而大多数流行的数据库都支持序列。