如何设置连接属性(包括同义词)

Posted

技术标签:

【中文标题】如何设置连接属性(包括同义词)【英文标题】:How to set connection properties (includeSynonyms) 【发布时间】:2020-07-07 01:53:47 【问题描述】:

我在 Spring Boot 中的数据库配置是使用 yaml 文件完成的:

# Common
spring:
  jpa:
    properties:
      hibernate:
        show_sql: true
        use_sql_comments: truecat
        format_sql: false
        ddl-auto: validate
        synonyms: true
        connection:
          includeSynonyms: true
#        CONNECTION_PROPERTY_INCLUDE_SYNONYMS_DEFAULT: 'true'
    database: ORACLE
  datasource:
    tomcat:
      max-active: 10
      max-idle: 10

# template only
---
spring:
  profiles: dev
  datasource:
    url: jdbc:oracle:thin:@//localhost:1521/DEV
    username: DEV
    password: ...

一开始我面对的是

架构验证:缺少表

所以我添加了hibernate.synonyms=true,现在我得到了

架构验证:缺少列

为了解决这个问题,我需要像这样https://gist.github.com/uggds/c3f0fa71037bc5177f60 改变连接

我可以在配置中这样做吗?

我尝试过但没有成功

hibernate.connection.CONNECTION_PROPERTY_INCLUDE_SYNONYMS_DEFAULT: true
hibernate.connection.includeSynonyms: true

相关:DatabaseMetaData.getColumns returning an empty ResultSet for synonyms

我试图用谷歌搜索,但我什么也没找到......

编辑:

基于 M. Deinum 答案的附加测试:

我坚信

spring:
  jpa:
    properties:
      hibernate.synonyms: true

spring:
  jpa:
    properties:
      hibernate:
        synonyms: true

是相同的,至少它具有相同的效果,当我使用一个或另一个时(两者都导致Schema-validation: missing column

我加了

  datasource:
    tomcat:
      max-active: 10
      max-idle: 10
      connection-properties:
        includeSynonyms: true

但我遇到了同样的错误

架构验证:缺少列

当我完全删除时

spring:
  jpa:
    properties:
      hibernate:
        synonyms: true

我来了

架构验证:缺少表

编辑 2:

尝试在 hikari 连接池上设置属性

spring:
  jpa:
    properties:
      hibernate:
        show_sql: true
        use_sql_comments: true
        format_sql: false
        ddl-auto: validate
        synonyms: true
    database: ORACLE
  datasource:
    hikari:
      connection-properties:
        includeSynonyms: true

我还在:

缺少列 [zone_definitionpk_id]

只是为了测试,当我用 view 替换同义词时它很好。另外,当我关闭验证时,它很好。我的意思是功能有效。

编辑 3

注意connection-propertiesdatasource-properties 的同义词验证需要更长的时间(至少对我而言)。

【问题讨论】:

它抱怨缺少列,因此您的列名与实体中的属性/字段/映射信息不匹配。 我做了调试hibernate没有检索同义词的列信息,这是missing column错误的根本原因。 嗯,这些设置中的任何一个都会随着您的错误发生变化。你确定你使用的是tomcat连接池吗?您使用的是哪个 Spring BOot 版本?此外,hibernate.synonymshibernate: synonyms: 与 Spring Boot 按原样使用来自 spring.jpa.properties 的属性不同。它不解析它下面的 YAML(这已经并且可能会成为混淆的根源)。属性按原样使用。 不,我不是 100% 确定使用了 tomcat 连接池。我在日志中看到HikariPool-1 - Start completed. 是相同还是不同?还有Running with Spring Boot v2.1.4.RELEASE, Spring v5.1.6.RELEASE 请将其添加到您的问题中。那么显然在tomcat连接池上设置属性几乎没有用。而是使用 spring.datasource.hikari 命名空间。 【参考方案1】:

设置hibernate.connection 属性是没有用的。您应该在数据源上设置它们。要设置其他非默认属性,您可以使用spring.datasource.tomcat 上的connection-properties 属性。

编辑:您使用的不是 Tomcat 连接池,而是默认的 HikariCP。所以设置tomcat属性几乎没用。

在您的属性中添加以下内容

spring.datasoure.hikari.datasource-properties.includeSynonyms=true

或yaml

spring:
  datasource:
    hikari:
      datasource-properties:
        includeSynonyms: true

您也可以设置相应的休眠属性,但不能像您那样。您需要通过spring.jpa.properties 进行设置。这是因为 synonyms 没有作为 Spring Boot 使用的属性对象上的属性公开。因此,您需要将其设置为附加属性。

注意在本节中使用完整的属性名称hibernate.synonyms 很重要,不要将其格式化为 YAML,因为这样不起作用!。

spring:
  jpa:
    properties:
      hibernate.synonyms: true

编辑(1):因为使用的池是 Hikari 而不是 Tomcatc 更改为 Hikari 命名空间和属性。

【讨论】:

感谢您的回复,但它不起作用 - 我会更新问题。 那你还没有设置合适的属性。它也是 yaml,所以请确保您的缩进是正确的! 我对 yaml 格式很小心,我也尝试使用 yaml-online-parser.appspot.com 解析它看起来不错,只是没有发挥作用...... 谢谢,成功了!也许我会建议你也有tomcat 的版本(特别是如果属性是connection-properties 而不是datasource-properties 和hikari)。 谢谢,仅使用 hibernate.synonyms: true 在未找到列上失败,但这个 hikari includeSynonyms 属性救了我!

以上是关于如何设置连接属性(包括同义词)的主要内容,如果未能解决你的问题,请参考以下文章

搜索引擎中同义词的挖掘及使用

如何使用受控词汇表或分类法来定义 XML 元素名称或属性名称?

oracle存储过程中,调用同义词报表和视图不存在。

oracle 同义词

Oracle数据库怎样跨库查询?

Oracle数据库对象,同义词序列视图索引