Как использовать hibernate.default_schema и hibernate.default_catalog - PullRequest
1 голос
/ 28 февраля 2020

Я использую Mysql и ранее в своем файле конфигурации Hibernate, я упомянул

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

в качестве URL-адреса соединения, где 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 в файле конфигурации Hibernate?

1 Ответ

1 голос
/ 07 марта 2020

Вы должны использовать hibernate.default_catalog вместо hibernate.default_schema.

В соответствии с MySql документацией URL-адрес соединения должен иметь следующий формат:

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

где

база данных

База данных или каталог по умолчанию для открытия. Если база данных не указана, соединение устанавливается без базы данных по умолчанию. В этом случае либо вызовите метод setCatalog() в экземпляре Connection, либо укажите имена таблиц, используя имя базы данных (то есть SELECT dbname.tablename.colname FROM dbname.tablename ...) в ваших операторах SQL. Открытие соединения без указания используемой базы данных, как правило, полезно только при создании инструментов, работающих с несколькими базами данных, таких как 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 Я должен сказать, что catalog * 1042 Понятия * и схема могут иметь совершенно разные значения от базы данных к базе данных. См. this для справки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...