【问题标题】:Hibernate GenerationType.IDENTITY vs GenerationType.SEQUENCEHibernate GenerationType.IDENTITY 与 GenerationType.SEQUENCE
【发布时间】:2021-03-03 17:04:12
【问题描述】:

我正在寻求对这个问题的澄清:@GeneratedValue(strategy="IDENTITY") vs. @GeneratedValue(strategy="SEQUENCE")(将近十年的历史有什么变化吗?)

开始学习 jpa,以下生成类型似乎都自动递增由 1 生成的主键。

身份:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

顺序:

@Id
@SequenceGenerator(
    name = "my_sequence",
    sequenceName = "my_sequence",
    allocationSize = 1
)
@GeneratedValue(
    strategy = GenerationType.SEQUENCE,
    generator = "my_sequence"
)
private Long id;

我了解GenerationType.SEQUENCE 创建的序列对象不像GenerationType.IDENTITY 那样直接绑定到表。老问题提到顺序可以更灵活。选择其中一种策略而不是另一种策略是否有任何目标优点或缺点?考虑到所引用问题的年龄,还有什么新东西吗?

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    正如休眠中所说的documentation

    重要的是要意识到使用IDENTITY 列会施加运行时行为,其中实体行必须在标识符值已知之前物理插入。

    这可能会弄乱扩展的持久性上下文(长时间的对话)。由于运行时强制/不一致,Hibernate 建议使用其他形式的标识符值生成(例如 SEQUENCE)。

    选择 IDENTITY 生成还有另一个重要的运行时影响:Hibernate 将无法为使用 IDENTITY 生成的实体批处理 INSERT 语句。

    这一点的重要性取决于特定于应用程序的用例。如果应用程序通常不会使用 IDENTITY 生成器创建给定实体类型的许多新实例,那么这个限制将不太重要,因为无论如何批处理都不会很有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-22
      • 1970-01-01
      • 2016-01-10
      • 1970-01-01
      • 1970-01-01
      • 2016-04-21
      • 2018-05-21
      相关资源
      最近更新 更多