是否可以在 JDBC 连接字符串或 SQL Server 的任何其他通用方式中设置架构

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

我正在尝试通过 Java 应用程序连接到 sql server。连接到 H2 数据库时,我将

schema=schema_name
附加到我的 java 应用程序中的连接字符串中,并且成功了。

但是,这对于 sqlserver 不起作用。连接已建立,但如果我的查询不包含表名之前的架构名称,则查询执行失败。

请让我知道 JDBC 支持连接字符串中的架构名称或任何其他方式。

java sql-server jdbc orm spring-jdbc
2个回答
2
投票

可悲的是,这是不可能的。您可能想要做的是为该用户设置默认架构。

create login foo with password = "superstronkpassword";
create user foober for login foo with default_schema = "my super schema";

0
投票

当然,如果我们使用

hibernate
spring datasource ORM

是可能的

让我们分解一下您提供的

CustomPhysicalNamingStrategy
类。该类是 Hibernate API 的一部分,专门用于自定义 Hibernate 如何在 Java 和 SQL 之间映射实体名称和数据库表名称。

CustomPhysicalNamingStrategy

概述

CustomPhysicalNamingStrategy
类实现了Hibernate的
PhysicalNamingStrategy
接口。该界面允许您为各种数据库元素(如表、列、序列和目录)定义自定义命名策略。

以下是课程各部分的详细讲解:

类别声明

public class CustomPhysicalNamingStrategy implements PhysicalNamingStrategy {
  • CustomPhysicalNamingStrategy
    :这是您的自定义命名策略类的名称。
  • implements PhysicalNamingStrategy
    :这意味着您的类必须为
    PhysicalNamingStrategy
    接口中定义的所有方法提供实现。

常数定义

private static final String SCHEMA = "job";
  • SCHEMA
    :用于定义将添加到表和序列名称的模式前缀的常量。

方法实现

  1. toPhysicalCatalogName

    @Override
    public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment context) {
        return name;
    }
    
    • 此方法将目录名称从逻辑命名(在代码中使用)转换为物理目录名称(在数据库中使用)。
    • 在此实现中,它只是返回未修改的名称,这意味着目录名称没有自定义。
  2. toPhysicalSchemaName

    @Override
    public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment context) {
        return name;
    }
    
    • toPhysicalCatalogName
      类似,此方法将模式名称从逻辑形式转换为物理形式。
    • 此实现还按原样返回名称,表示没有自定义架构名称修改。
  3. toPhysicalTableName

    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
        return new Identifier(SCHEMA + "." + name.getText(), name.isQuoted());
    }
    
    • 此方法将逻辑表名称转换为其物理表示形式。
    • 在此实现中,它将架构前缀 (
      SCHEMA
      ) 添加到表名称之前。例如,如果逻辑表名称为
      Employee
      ,则会转换为
      job.Employee
    • name.getText()
      检索逻辑表名称的文本,
      name.isQuoted()
      维护原始名称是否被引用。
  4. toPhysicalSequenceName

    @Override
    public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment context) {
        return new Identifier(SCHEMA + "." + name.getText(), name.isQuoted());
    }
    
    • 此方法与
      toPhysicalTableName
      类似,但它处理序列名称。
    • 它还将模式前缀添加到序列名称前面,遵循相同的逻辑。
  5. toPhysicalColumnName

    @Override
    public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) {
        return name;
    }
    
    • 此方法将逻辑列名称转换为其物理表示形式。
    • 在此实现中,列名返回不变,这意味着没有自定义命名策略应用于列名。

总结

CustomPhysicalNamingStrategy
类通过在名称中添加模式前缀(
job.
)来自定义数据库中表和序列的物理命名。它保持目录名称、模式名称和列名称不变。这对于确保表和序列在数据库中的特定模式下组织非常有用。

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