【问题标题】:How to create property to define different schema name with universal prefix?如何创建属性以定义具有通用前缀的不同模式名称?
【发布时间】:2020-02-17 11:18:47
【问题描述】:

问题是我有很多本地查询,我使用模式名称前缀来定义我想要使用的表。

例如:

SELECT * FROM SCHEMA.USERS u WHERE u.id = 100;

问题是现在我有 2 个具有相同表但不同模式名称的数据库。

DB1: SCHEMA_1.USERS
DB2: SCHEMA_2.USERS

这是否可以为休眠创建属性,我可以定义SCHEMA_1SCHEMA_2 将被称为SCHEMA?正如我所检查的,Oracle SYNONYM 不适用于模式..

【问题讨论】:

    标签: java oracle hibernate


    【解决方案1】:

    根据休眠documentation

    当使用多个数据库目录和模式时,Hibernate 提供了设置全局目录或模式的可能性,这样您就不必为每个实体显式声明它。

    <property name="hibernate.default_catalog" value="crm"/>
    <property name="hibernate.default_schema" value="analytics"/>
    

    还有:

    但是,对于本机查询,SQL 查询按原样传递,因此您需要在引用数据库表时显式设置全局目录和架构。幸运的是,Hibernate 允许您使用以下占位符解析当前的全局目录和架构:

    {h-catalog} - 解析当前的hibernate.default_catalog 配置属性值。

    {h-schema} - 解析当前的hibernate.default_schema 配置属性值。

    {h-domain} - 解析当前的 hibernate.default_cataloghibernate.default_schema 配置属性值(例如 catalog.schema)。

    因此,您可以避免在本机 sql 中明确提及架构名称:

    SELECT * FROM {h-schema}USERS u WHERE u.id = 100;
    

    但至于你的问题:

    这是否可以为休眠创建属性,我可以在其中定义 SCHEMA_1SCHEMA_2 将被称为 SCHEMA?

    我想只使用标准的休眠功能是不可能的。

    【讨论】:

      【解决方案2】:

      我不是 Hibernate 背景,所以我不知道 Hibernate 本身是否有任何本地方法可以做到这一点。在纯 Oracle 方法中,当您连接到数据库时,获取当前模式名称并将其分配给一个变量,然后在 SQL 语句中使用它。

      select sys_context( 'userenv', 'current_schema' ) as SCHEMA from dual;
      

      您可以将上述输出分配给 Hibernate 应用程序代码中的 SCHEMA 变量(我再次不确定使用变量的 Hibernate 方法是什么,所以现在假设 $):

      SELECT * FROM $SCHEMA.USERS u WHERE u.id = 100;
      

      因此,当您连接到 DB1 时,您将获得架构名称,比如 SCHEMA_1,然后从 DB2 获得 SCHEMA_2。但是这些值将分配给$SCHEMA 变量,因此您不必担心更改它,因为它会动态采用架构名称。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-20
        • 1970-01-01
        • 1970-01-01
        • 2014-01-19
        • 1970-01-01
        • 1970-01-01
        • 2020-06-22
        • 1970-01-01
        相关资源
        最近更新 更多