带有 Hibernate 5.6 的 Springboot 2.7.2 在插入期间出现 ORA 32575 错误

问题描述 投票:0回答:1

使用 Springboot 2.7.2 和 Hibernate 5.6 以及 Oracle 12.2 编写 Web 应用程序。我使用存储库模型通过 mockmvc 进行插入和测试。打开 SQL 调试后,我在执行插入语句时收到错误 ORA 32575。在调试日志中,它有 INSERT INTO TABLE (COL1, COL2, ID) VALUES ('X','Y',DEFAULT)。 Oracle 错误 32575 紧随其后。有问题的 ID 字段是 Hibernate pojo 的一部分并且是主键并使用 GenerationType.SEQUENCE。它是一个指向表的实体。

DataSource 是使用 ojdbc8.jar 的“瘦”驱动程序。数据源是在 Tomcat 启动期间在应用程序中使用 @Configuration" 注释设置的。如果你自己处理所有这些,我不会得到上面的错误。

但是,由于我们使用Oracle Label Security,我有一个要求通过PROXY USER 帐户连接到每个数据库用户。它看起来像 GRANT CONNECT TO userX THROUGH proxyuser。使用数据库驱动程序就像

Properties proxyProps = new Properties()
proxyProps.set(Connection.PROXY_USER_NAME, user)
oraCon.openProxySession(Connection.PROXYTYPE_USER_NAME)  

这是在一个名为 ProxyDelegatingDatasourceThin 的应用程序类内部完成的,它扩展了 DelegatingDataSource,这是一个 Spring 类,我相信在进行新的连接尝试时会调用它。

再次,查询工作正常,更新似乎工作,它只是插入。 ID 列本身设置为 NUMBER 并标记为主键。它没有设置为任何类型的 IDENTITY 列。

错误似乎希望从 INSERT 语句中一起省略 ID 列,但 Hibernate 或 Spring 正在使用与 ID 关联的 VALUES 中的 DEFAULT 生成它。

我希望有人能提供帮助。花了几天时间。

  1. 将@ID 列设置为可空、可插入、可更新全部设置为 false
  2. 尝试使用实体管理器 (EntityManager) 的合并和持久化,而不是使用 Spring Repository save() 方法。
  3. 隐式缓存属性设置为true

错误似乎希望从 INSERT 语句中一起省略 ID 列,但 Hibernate 或 Spring 正在使用与 ID 关联的 VALUES 中的 DEFAULT 生成它。

添加更多信息...

当我删除上面打开代理会话的代码时,我没有收到错误。我还在使用代理会话时从数据库上下文中打印了一些信息,代理用户是代理帐户,会话用户是通过代理帐户连接的用户。

无论我使用 Oracle Thin Driver 还是 UCP,我都会得到相同的结果。

oracle spring-boot hibernate sql-insert
1个回答
0
投票

此错误已通过使用更新版本的 Oracle Driver ojdbc8.jar 解决

© www.soinside.com 2019 - 2024. All rights reserved.