首页 > 解决方案 > 如何使用 hibernate.default_schema 和 hibernate.default_catalog

问题描述

我在我提到的休眠配置文件中使用 Mysql 和更早的版本

<property name="hibernate.connection.url">jdbc:mysql://localhost/TestDB</property>

作为连接网址,TestDB我要连接的架构在哪里。

我想将配置文件中的默认架构指定为

<property name="hibernate.connection.url">jdbc:mysql://localhost</property>
<property name="hibernate.default_schema">TestDB</property> 

但它不是以这种方式工作的,它给了我一个错误,说

java.sql.SQLException: No database selected 

谁能帮我举个例子来说明如何在休眠配置文件中使用hibernate.default_schema, ?hibernate.default_catalog

标签: mysqlhibernate

解决方案


您应该使用hibernate.default_catalog而不是hibernate.default_schema.

根据 MySql文档,连接 url 应具有以下格式:

protocol//[hosts][/database][?properties]

在哪里

数据库

要打开的默认数据库或目录。如果未指定数据库,则在没有默认数据库的情况下建立连接。在这种情况下,要么调用实例setCatalog()上的方法,要么在 SQL 语句中Connection使用数据库名称(即...)指定表名。SELECT dbname.tablename.colname FROM dbname.tablename在不指定要使用的数据库的情况下打开连接通常仅在构建与多个数据库一起使用的工具时有用,例如 GUI 数据库管理器。

假设我们有以下 MySql 数据库:

create database DB_A;
create database DB_B;

create table DB_A.TST_EMPLOYEE(
  emp_id int primary key,
  emp_name varchar(100)
);

create table DB_B.TST_EMPLOYEE(
  emp_id int primary key,
  emp_name varchar(100)
);

那么我们可以hibernate.cfg.xml通过以下方式指定数据库连接:

<property name="hibernate.connection.url">jdbc:mysql://localhost:3306</property>
<property name="hibernate.default_catalog">DB_A</property>
<property name="hibernate.connection.username">your_user</property>
<property name="hibernate.connection.password">your_pass</property>

以下列方式为DB_A.TST_EMPLOYEE和表声明实体:DB_B.TST_EMPLOYEE

@Entity
@Table(name = "TST_EMPLOYEE")
public class EmployeeA
{
   // ...
}

@Entity
@Table(name = "TST_EMPLOYEE", catalog = "DB_B")
public class EmployeeB
{
   // ...
}

然后以通常的方式使用它们。此外,对于本机查询,您可以使用属性{h-catalog}中指定的默认目录的占位符。hibernate.default_catalog

PS我不得不说,目录模式概念在数据库之间可能具有完全不同的含义。请参阅this以供参考。


推荐阅读