В одном из моих проектов у меня есть приложение, которое управляет несколькими клиентами (или клиентом, если вы предпочитаете). Для каждого из них у меня есть выделенная схема в базе данных. Однако приложение обрабатывает только один клиент за раз, то есть пользователь должен переключиться с одного клиента на другой в приложении (во время выполнения, без перезапуска приложения), чтобы получить доступ к данным от этого нового клиента.Как обрабатывать несколько схем DB с Hibernate?
Как вы могли бы управлять соединениями, а также уровнем персистентности для такого проекта?
Я хочу использовать Hibernate для этого. Каковы точки, на которых я должен быть очень осторожен при работе с несколькими базами данных/схемами?
Может ли весна оказать какую-либо помощь в этом случае?
Если я недостаточно ясен, позвольте мне объяснить ситуацию на примере. Представьте, что мое приложение может обрабатывать два клиента: clientONE
и clientTWO
. Я уже реализовал класс, который может предоставить мне схему базы данных, пользователя, пароль и строку соединения для данного клиента.
У каждого клиента есть список должников, но, к сожалению, структура таблицы DEBTOR не одинакова для clientONE
и clientTWO
. Даже имена таблиц/столбцов не то же самое ...
Так что я могу создать один класс должнику на одного клиента (я использую Hibernate аннотации):
@Entity
@Table(name = "T_DEBTOR_ONE")
...
public class ClientOneDebtor {
@Id
@Column(name = "ID_DEBTOR")
private String idDebtor;
...
}
и:
@Entity
@Table(name = "T_DEBTOR_TWO") // Table names are not the same among the different schemas...
...
public class ClientTwoDebtor {
@Id
@Column(name = "DEBTOR_ID") // It's just to show that the same information is stored in a column that has not the same name.
private String idDebtor;
...
}
В идеале я попытаюсь иметь общий класс Debtor
(здесь есть класс Аннотация, но я могу использовать интерфейс):
public abstract class AbstractDebtor {
public abstract String getIdDebtor();
...
}
@Entity
@Table(name = "T_DEBTOR_ONE")
...
public class ClientOneDebtor extends AbstractDebtor {
@Id
@Column(name = "ID_DEBTOR")
private String idDebtor;
...
}
@Entity
@Table(name = "T_DEBTOR_TWO")
...
public class ClientTwoDebtor extends AbstractDebtor {
@Id
@Column(name = "DEBTOR_ID") // It's just to show that the same information is stored in a column that has not the same name.
private String idDebtor;
...
}
Таким образом, мне будет легче манипулировать объектами Debtor на моем уровне DAO/Service, так как мне не нужно дублировать мои DAO и сервисы для каждого клиента. Например, метод из DAO, чтобы получить список всех должников, будет public List<AbstractDebtor> getAllDebtors() { ... }
.
Итак, как бы изменить контекст при изменении клиента, управляемого моим приложением? В других словах, как я могу указать Hibernate (или Spring?), Что я хочу использовать правильные объекты персистентности (ClientOneDebtor
или ClientTwoDebtor
) относительно клиента, который в настоящее время управляется моим приложением?
Если вы думаете, что я иду в неправильном направлении, не стесняйтесь поделиться своими идеями о том, как решать проблемы такого рода ...
Редактировать относительно первых ответов:
Число различных схем, которые мне нужно будет обрабатывать, составляет около 15-20. Кроме того, мне нужно будет отобразить только небольшое подмножество их таблиц.
Я также знаю, что наличие одной схемы на клиента/клиента не является лучшим решением для хранения данных.Однако эта архитектура существует с 5 лет, и мы можем перейти только к одной схеме в течение следующего года (в лучшем случае;)).