Database 在数据库中使用“@SequenceGenerator”与自动增量相比有什么优势?
根据我对SequenceGenerator注释和序列名的理解,hibernate将通过调用nextval()获取id的下一个值,然后在插入新条目时使用该id 另一种方法是在数据库中将列标记为自动增量,然后Hibernate就不必这样做了。例如,对于Postgres,在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') 每种方法的优点/缺点是什么?是否存在一种方法优于另一种方法的特定情况?自动策略 为每个数据库维护一个特殊的全局编
CREATE TABLE
查询的列定义中
id INTEGER主键默认值nextval('my\u id\u seq')
每种方法的优点/缺点是什么?是否存在一种方法优于另一种方法的特定情况?自动策略
为每个数据库维护一个特殊的全局编号生成器
此数字生成器用于为未定义主键字段的实体对象生成自动对象ID,同一数字生成器还用于为主键字段生成数字值,主键字段由@GeneratedValue使用自动策略注释:
@Id @GeneratedValue(strategy=GenerationType.AUTO) long 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 allowallocationSize
可提高性能的功能
您可以对许多表使用与ID生成器相同的序列(它也可能是架构决策/业务需求)
需要在数据库中创建序列。。。这是DBA操作,在您的环境中允许吗
使用自动递增
你没有以前的优点/缺点
直截了当
但是你无法控制生成的id或生成方式。。。性能可能不好(选择“最大id”、“增量为1”、“更新”)
通常在生产环境中,人们推荐table generator作为最便携/可监控的解决方案。。。但这要视情况而定