我们说我有一个Car
实体:
@Entity
public class Car {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;
当我向数据库添加新对象时,spring如何知道自动增量的值是什么?
答案 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 ,如果您的数据库支持序列,则 最受欢迎的数据库。