首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring GeneratedValue注解用法

Spring GeneratedValue注解用法
EN

Stack Overflow用户
提问于 2017-12-06 22:16:00
回答 1查看 18.5K关注 0票数 10

假设我有一个Car实体:

代码语言:javascript
运行
复制
@Entity 
public class Car {
      @Id
      @GeneratedValue(strategy=GenerationType.AUTO)
      private Integer id;

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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注释允许您定义生成器的名称、数据库序列的名称和模式以及序列的分配大小。

代码语言:javascript
运行
复制
@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,而大多数流行的数据库都支持序列。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47676403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档