Database 在数据库中使用“@SequenceGenerator”与自动增量相比有什么优势?

Database 在数据库中使用“@SequenceGenerator”与自动增量相比有什么优势?,database,hibernate,jpa,Database,Hibernate,Jpa,根据我对SequenceGenerator注释和序列名的理解,hibernate将通过调用nextval()获取id的下一个值,然后在插入新条目时使用该id 另一种方法是在数据库中将列标记为自动增量,然后Hibernate就不必这样做了。例如,对于Postgres,在CREATE TABLE查询的列定义中 id INTEGER主键默认值nextval('my\u id\u seq') 每种方法的优点/缺点是什么?是否存在一种方法优于另一种方法的特定情况?自动策略 为每个数据库维护一个特殊的全局编

根据我对SequenceGenerator注释和序列名的理解,hibernate将通过调用nextval()获取id的下一个值,然后在插入新条目时使用该id

另一种方法是在数据库中将列标记为自动增量,然后Hibernate就不必这样做了。例如,对于Postgres,在
CREATE TABLE
查询的列定义中

id INTEGER主键默认值nextval('my\u id\u seq')

每种方法的优点/缺点是什么?是否存在一种方法优于另一种方法的特定情况?

自动策略 为每个数据库维护一个特殊的全局编号生成器

此数字生成器用于为未定义主键字段的实体对象生成自动对象ID,同一数字生成器还用于为主键字段生成数字值,主键字段由@GeneratedValue使用自动策略注释:

@Id @GeneratedValue(strategy=GenerationType.AUTO) long id;
只要您使用自动策略,提交到数据库的每个对象都将从同一个池接收下一个递增的ID

顺序策略
  • 第一个大的区别是,我们创建了单独的序列,用于所选的实体,而不是使用全局ObjectDB,在全局ObjectDB中,具有strategyauto的每个实体都接收ID
  • 使用序列策略,只要新实体对象被持久化(即在提交之前),ID就会自动生成。这在较早需要主键值时可能很有用

  • My source和更深入的artcile

    如果您的列在数据库中具有自动递增功能,则可以在持久实体类中使用
    @GeneratedValue
    注释该列,这有助于在保存到数据库时自动递增

    @Entity
    @Table(name="s3_dominant_person")
    public class S3_Dominant_Person {
     @Id
     @GeneratedValue
     private Integer id;
    
    您还必须在数据库表中
    自动增加该列

    's3_dominant_person', 'CREATE TABLE `s3_dominant_person` ( `id` int(11) 
    NOT NULL AUTO_INCREMENT, 
    

    使用
    @SequenceGenerator

  • 你的数据库应该支持顺序!!!因此,如果您后来决定从oracle迁移到mysql,比如说,它将无法移植
  • 在某些情况下,可能需要遵循顺序(架构决策)
  • sequence allow
    allocationSize
    可提高性能的功能
  • 您可以对许多表使用与ID生成器相同的序列(它也可能是架构决策/业务需求)
  • 需要在数据库中创建序列。。。这是DBA操作,在您的环境中允许吗
  • 使用
    自动递增

  • 你没有以前的优点/缺点
  • 直截了当
  • 但是你无法控制生成的id或生成方式。。。性能可能不好(选择“最大id”、“增量为1”、“更新”)
  • 通常在生产环境中,人们推荐table generator作为最便携/可监控的解决方案。。。但这要视情况而定