【问题标题】:duplicate id values generating in JPA entity when copy data from another table and continue从另一个表复制数据并继续时,在 JPA 实体中生成重复的 id 值
【发布时间】:2020-10-16 19:35:27
【问题描述】:

我有一个具有自动生成 id 值的实体,并且我正在使用 MySQL DB

实体定义

@Id @GeneratedValue(strategy = GenerationType.IDENTITY)

私人长ID;

MYSQL 中的表列定义

id bigint not null auto_increment

我不得不从外部将数据复制到表中,我想继续生成实体并保存它们,但似乎在 JPA 端它生成了数据库中已有的 id 值(从外部复制)

有没有办法告诉 JPA,从 MySQL 表中的任何内容生成下一个 id?

当我同时使用 JPA 端的自动生成和 DB 端的自动增量列时,它在内部是如何工作的,哪一方获得优先权?

【问题讨论】:

    标签: java mysql spring jpa


    【解决方案1】:

    GenerationType.IDENTITY 不是最好的使用方式,因为它缺乏性能。它的工作方式是它依赖于一个自动递增的数据库列,并让数据库在每次插入操作时生成一个新值,因此在 DB 中会有一个序列来生成这些值。

    但是问题来了:如果你使用 Hibernate,它需要每个托管实体的主键值,所以它必须立即执行插入语句才能工作。这避免了使用 JDBC 批处理优化。

    当我同时使用从 JPA 端自动生成和自动增量时 DB端的列,它在内部是如何工作的,哪一方得到 优先级?

    @GeneratedValue(strategy=GenerationType.TABLE) 指示提供者在将新实体插入数据库时​​使用表来获取 ID。

    当使用 Hibernate 作为提供者时,您会发现一个名为 hibernate_sequences 的表,其中包含两列:实体名称和已分配给该实体的最大标识。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2018-07-10
      • 2018-12-25
      • 2017-02-26
      • 2020-09-21
      • 1970-01-01
      • 2021-11-14
      • 2014-06-20
      • 2016-01-02
      • 2018-09-11
      相关资源
      最近更新 更多