【问题标题】:Hibernate/JPA - Save/Insert functions failing org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a];Hibernate/JPA - 保存/插入函数失败 org.springframework.dao.InvalidDataAccessResourceUsageException:无法提取 ResultSet; SQL [不适用];
【发布时间】:2021-07-17 08:17:53
【问题描述】:

每次我尝试在我的 spring 应用程序中点击我的 POST 端点之一时,我都会收到此错误,该端点仅调用这 3 个 JPA 保存方法中的 1 个:

save()
saveAll()
saveAndFlush()

org.springframework.dao.InvalidDataAccessResourceUsageException:无法提取结果集; SQL [不适用];嵌套异常是 org.hibernate.exception.SQLGrammarException: could not extract ResultSet …… 引起:java.sql.SQLSyntaxErrorException:ORA-00942:表或视图不存在 …… 原因:oracle.jdbc.OracleDatabaseException: ORA-00942: 表或视图不存在

我想先澄清几点:

  1. 我通过非表所有者用户登录,该用户已被授予选择、插入、更新和删除权限。我已经在 SQL 客户端中进行了测试,以确认我的用户确实可以访问这 4 个 sql 操作。
  2. 使用任何其他 JPA 方法(如 找到所有, findAllById, 数数, 等等。甚至是我在 @Repository 类下创建的方法。可以毫无问题地找到和查询表。此外,表或存储库没有任何异常。
  3. 当使用表的“所有者”用户时,我能够成功保存任何数据而不会出现问题。
  4. 表/存储库作为依赖项从其他项目导入。

我发现与此特定 JPA 保存问题相关的唯一内容是 this 文章,其中提到了这一点

Hibernate,PostgreSQL:无法提取结果集,SQLState,您的实际问题很简单:您在只读事务中调用了 save() 操作。但是,因为你吞下了你的例外: /p>

我不知道从哪里开始尝试解决此错误。这些是相关依赖代码的版本,虽然我也玩过这些,但没有任何运气。

  • org.hibernate:hibernate-core 5.4.30.Final(试过5.4.21.Final)

  • org.hibernate.common:hibernate-commons-annotations 5.1.2.Final(试过 5.1.0.Final)

  • org.springframework.data:spring-data-jpa 2.4.8(试过2.3.4.Release)

我也使用它作为我的属性,它确实成功地验证了我的数据库架构,否则服务将在启动时失败。我看到有人说要使用“更新”,但这没有帮助,不应该是解决方案。

spring.jpa.hibernate.ddl-auto=validate

感谢任何帮助。我不认为这是代码问题,但同时我在 oracle DB 端找不到任何看起来不寻常的东西。

【问题讨论】:

    标签: sql spring oracle hibernate jpa


    【解决方案1】:

    我想到的一些想法:

    • 检查实体关系。也许您通过@OneToMany(等)在您的实体中保存另一个实体,并且您没有另一个表的权限
    • 如果是 Oracle - 检查您正在使用的表的序列权限。您还需要他们的特权
    • 如果有任何触发器 - 您也可以在那里查看您的访问权限

    【讨论】:

      【解决方案2】:

      解决方案:

      启用后

      spring.jpa.show-sql=true
      

      我意识到这是它在崩溃之前执行的第一行 sql。

      Hibernate: select hibernate_sequence.nextval from dual
      

      每个 JPA 保存操作都使用此序列的原因是因为我在表的 @Id 上使用了 @GeneratedValue(strategy = GenerationType.AUTO)。为了解决这个问题,我只是简单地执行了将 non_owner_acct 授予该 SEQUENCE 的权限。

      GRANT SELECT ON "SCHEMA"."HIBERNATE_SEQUENCE" TO "NON_OWNER_ACCT";
      

      【讨论】:

        【解决方案3】:

        只需在属性文件中使用hibernate的更新查询

        spring.jpa.hibernate.ddl-auto=update
        

        它将刷新并更新您的数据库

        我也有同样的问题,但解决了,它在 spring boot 中工作

        【讨论】:

          猜你喜欢
          • 2015-05-27
          • 2020-07-17
          • 2014-07-20
          • 1970-01-01
          • 2021-08-01
          • 2016-05-06
          • 1970-01-01
          • 2016-02-17
          相关资源
          最近更新 更多