假设我有一个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)
(旁注:通常更喜欢Long
ids 而不是Integer
这样你不太可能用完)
生成类型表
GenerationType.TABLE现在很少使用。它通过在数据库表中存储和更新其当前值来模拟序列,这需要使用悲观锁将所有事务按顺序排列。这会减慢您的应用程序的速度,因此您应该更喜欢 GenerationType.SEQUENCE,如果您的数据库支持序列,而大多数流行的数据库都支持序列。
归档时间: |
|
查看次数: |
15946 次 |
最近记录: |