在数据库中使用`@ SequenceGenerator`与自动增量有什么好处?

时间:2018-04-27 09:55:19

标签: database hibernate jpa

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

另一种方法是在数据库中将列标记为自动增量,然后Hibernate将不必执行此操作。例如,使用Postgres,在CREATE TABLE查询

的列定义中

id INTEGER PRIMARY KEY DEFAULT nextval('my_id_seq')

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

3 个答案:

答案 0 :(得分:1)

@SequenceGenerator

  1. 你的数据库应该支持顺序!!!因此,如果你后来决定从oracle转移到mysql -say-它不会是便携式的
  2. 在某些情况下可能需要坚持顺序(建筑决策)
  3. 序列允许allocationSize功能,可以提高性能
  4. 您可以将许多表使用相同的序列作为ID生成器(也可能是架构决策/业务要求)
  5. 要求在数据库中创建序列...这是一个DBA操作,是否允许在您的环境中使用?
  6. Auto increment

    1. 您没有以前的优点/缺点
    2. 直接轻松
    3. 但您对生成的ID或生成方式没有任何控制权......可能性能不佳(选择最大ID,增加1,更新)
    4. 通常在生产环境中,人们推荐使用表格生成器作为最便携/可监控的解决方案......但它总是取决于

答案 1 :(得分:0)

自动策略

ObjectDB为每个数据库维护一个特殊的全局数字生成器。

此数字生成器用于为没有定义主键字段的实体对象生成自动对象ID,并且相同的数字生成器也用于为使用AUTO策略的 @GeneratedValue注释的主键字段生成数值:

@Id @GeneratedValue(strategy=GenerationType.AUTO) long id;

只要您使用自动策略,每个COMMITED到数据库的对象都将从同一个池中接收下一个递增的ID。

序列策略

  1. 第一个很大的区别是我们创建了单独的序列,用于选择的entites而不是Global ObjectDB,其中每个策略 auto 的实体都会收到ID。
  2. 使用序列策略,只要新实体对象被持久化(即在提交之前),就会使用自动值生成ID。当先前需要主键值时,这可能很有用。
  3. 我的来源和更深入的artcile HERE

答案 2 :(得分:0)

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

@Entity
@Table(name="s3_dominant_person")
public class S3_Dominant_Person {
 @Id
 @GeneratedValue
 private Integer id;

您必须在数据库表

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