假设我有一个Car
实体:
@Entity
public class Car {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;
当我向数据库添加一个新对象时,spring如何知道要自动递增的值是什么?
发布于 2017-12-06 22:20:09
这里的是一个
有4种生成主键的选项
GenerationType.AUTO
GenerationType.AUTO是默认的生成类型,它让持久性提供者选择生成策略。
如果您使用Hibernate作为持久性提供者,它将根据特定于数据库的方言选择一种生成策略。对于大多数流行的数据库,它选择GenerationType.SEQUENCE。
GenerationType.IDENTITY
GenerationType.IDENTITY是中最容易使用的,但从性能的角度来看,不是最好的。它依赖于一个自动递增的数据库列,并允许数据库在每次插入操作时生成一个新值。从数据库的角度来看,这是非常有效的,因为自动增量列是高度优化的,并且不需要任何额外的语句。
如果您使用Hibernate,这种方法有一个很大的缺点。Hibernate需要每个托管实体的主键值,因此必须立即执行insert语句。这阻止了它使用不同的优化技术,比如JDBC批处理。
GenerationType.SEQUENCE
GenerationType.SEQUENCE使用数据库序列来生成唯一值。它需要额外的select语句来从数据库序列中获取下一个值。但对于大多数应用程序,这不会对性能造成影响。
如果您没有提供任何附加信息,Hibernate将从其默认序列中请求下一个值。您可以通过在@GeneratedValue
注释的@SequenceGenerator
属性中引用生成器的名称来更改这一点。@SequenceGenerator
注释允许您定义生成器的名称、数据库序列的名称和模式以及序列的分配大小。
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@SequenceGenerator(name="car_generator", sequenceName = "car_seq", allocationSize=50)
private Long id;
(附注:通常更喜欢使用Long
作为ids,而不是Integer
,这样您就不太可能用完)
GenerationType.TABLE
GenerationType.TABLE得到了,现在很少用到。它通过在数据库表中存储和更新序列的当前值来模拟序列,这需要使用悲观锁,从而将所有事务按顺序排列。这会减慢您的应用程序,因此,如果您的数据库支持序列,那么您应该首选GenerationType.SEQUENCE,而大多数流行的数据库都支持序列。
https://stackoverflow.com/questions/47676403
复制相似问题