gpt4 book ai didi

java - JPA GenerationType.AUTO 不考虑具有自动增量的列

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:52:42 26 4
gpt4 key购买 nike

我有一个表,其中包含一个简单的 int id 列,在 SQL Server 中标识自动递增。

实体的 Id 用 @Id@GeneratedValue 注释

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", length = 4, precision = 10, nullable = false)
private Integer id;

在 SQL Server 中,该列已正确设置为带有 SeedIncrement 等于 1 的标识。

当我尝试保留该实体的实例时,Hibernate 尝试查询 hibernate_sequence 表以获取 ID 值。由于我没有在我的架构中创建该表,所以我收到了一个错误:

无法读取 hi 值:com.microsoft.sqlserver.jdbc.SQLServerException:对象名称“MySchema.hibernate_sequence”无效

如果我将生成类型更改为 IDENTITY,一切都会按预期进行

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", length = 4, precision = 10, nullable = false)
private Integer id;

我不能这样改变它,因为我的应用程序将同时在 MS SQL 和 ORACLE 上运行,而后者不支持自动递增的列。

据我所知,如果底层数据库支持,AUTO 类型应该使用自动递增行为,所以我不知道为什么不起作用。

更新:

我花了一些时间,但我能够准确理解发生了什么。

我正在使用具有以下行为的遗留数据库:

  • MSSQL:id 生成使用表 IDENTITY
  • ORACLE:id 生成使用触发器。触发器查询并更新存储所有“下一个 ID”的自定义表。该表称为 SEQ。

下面是使用一些 id 生成策略的结果:

  • AUTO:如上所述,在 MSSQL 中不起作用
  • IDENTITY:适用于 MSSQL,但不受 Oracle 支持
  • “native”:在 MSSQL 中工作但在 ORACLE 中失败。它失败是因为 Hibernate 激活了它的默认序列策略,该策略使用 hibernate_sequences.nextval。由于这是一个遗留应用程序,来自 SEQ 表(上面提到的)和 hibernate_sequences 的值不同步(该特定表的 SEQ 值是 6120,而 hibernate_sequences' 是 1,这是预期的因为直到现在才使用它)。

所以我需要弄清楚的是一种将该实体配置为:

  • 使用 MSSQL Identity 功能或者
  • 使用 Oracle 时,不要自动为 ID 变量设置任何值,而将所有内容留给预先存在的触发器

当我需要插入依赖于主实体(通过外键)的实体时,这可能会导致我在 Oracle 上出现严重问题,因为 Hibernate 不知道“外部”触发器生成了哪个 ID 值。

最佳答案

我遇到了类似的问题并找到了这个 information (在 here 中有更深入的解释)。

将这个属性添加到我的 persistence.xml 文件中解决了这个问题:

<property name="hibernate.id.new_generator_mappings" value="false" />

关于java - JPA GenerationType.AUTO 不考虑具有自动增量的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25047226/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com