我正在尝试通过 Java 应用程序连接到 sql server。连接到 H2 数据库时,我将
schema=schema_name
附加到我的 java 应用程序中的连接字符串中,并且成功了。
但是,这对于 sqlserver 不起作用。连接已建立,但如果我的查询不包含表名之前的架构名称,则查询执行失败。
请让我知道 JDBC 支持连接字符串中的架构名称或任何其他方式。
可悲的是,这是不可能的。您可能想要做的是为该用户设置默认架构。
create login foo with password = "superstronkpassword";
create user foober for login foo with default_schema = "my super schema";
当然,如果我们使用
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
:用于定义将添加到表和序列名称的模式前缀的常量。toPhysicalCatalogName
@Override
public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment context) {
return name;
}
toPhysicalSchemaName
@Override
public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment context) {
return name;
}
toPhysicalCatalogName
类似,此方法将模式名称从逻辑形式转换为物理形式。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()
维护原始名称是否被引用。toPhysicalSequenceName
@Override
public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment context) {
return new Identifier(SCHEMA + "." + name.getText(), name.isQuoted());
}
toPhysicalTableName
类似,但它处理序列名称。toPhysicalColumnName
@Override
public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) {
return name;
}
CustomPhysicalNamingStrategy
类通过在名称中添加模式前缀(job.
)来自定义数据库中表和序列的物理命名。它保持目录名称、模式名称和列名称不变。这对于确保表和序列在数据库中的特定模式下组织非常有用。