Как динамически изменить единицу измерения персистентности?

1

У меня есть приложение Spring MVC + Hibernate + JPA. Также есть 4 разных схемы в моем db с подобными таблицами. (для разных компаний).

Теперь, когда я использую свое приложение Hibernate, могу ли я переключить группу сохранения, чтобы я мог использовать ту же форму (с тем же контентом) для сохранения данных во всех четырех схемах?

Я знаю, что во время выполнения я могу переключить блок сохранения, но я хочу иметь возможность использовать уже загруженные формы для сохранения данных во все четыре схемы путем изменения единицы измерения продолжительности.

Теги:
spring
hibernate
jpa
persistence.xml

2 ответа

2

Некоторое время назад у меня была схожая проблема. У меня было две одинаковые схемы - приложение должно было сохраняться до первого или второго в зависимости от некоторой логики. Это был чистый Hibernate, но, говоря о JPA, я предлагаю иметь 4 единицы персистентности, определенные в вашем persistence.xml:

persistence.xml

<persistence-unit name="PU1">
  ...
</persistence-unit>

<persistence-unit name="PU2">
  ...
</persistence-unit>

[...]

и класс DAO, который вводил прокси EntityManager - каждый для разных PU:

@Repository
public class MyDaoImpl implements MyDao {

    @PersistenceContext(unitName = "PU1") 
    private EntityManager em1;

    @PersistenceContext(unitName = "PU2") 
    private EntityManager em2;

    ...

    public void saveToPU1(MyEntity e) {
        em1.persist(e);
    }
    public void saveToPU2(MyEntity e) {
        em2.persist(e);
    }
    ...

}

Конечно, em1 аннотированный с @PersistenceContext(unitName="PU1") является прокси-сервером Spring для сеанса Hibernate и становится открытым и связан с текущим потоком, только если этот поток пытается его использовать.

2

Я не уверен, что понимаю вашу проблему: вы можете изменить PersistentUnit, используемый во время выполнения, с помощью метода Persistence # createEntityManagerFactory (String persistenceUnitName).

Но если вы хотите

сохранять данные во все четыре схемы

Затем вы должны повторить операцию (сохраняйте, я думаю) четыре раза (например, в частном методе, в котором имя единицы сохранения сохраняется как параметр).

Вы можете ввести кеш формы, если хотите повторно использовать уже загруженные формы, но это вопрос архитектуры программного обеспечения.

Как было предложено в учебнике Java EE 5, с точки зрения программного обеспечения, наличие формы, зависящей непосредственно от уровня JPA, не является лучшей практикой. Другой ответ подсказывает: DAO может быть решением. Все о вашем жизненном духе DAO.

Книга основных моделей JEE предлагает это (в онлайн-ссылке упоминается кратко тема, лучше напечатанная книга): сопоставление DAO с шаблоном Factory - хорошая идея. Вы можете перерабатывать EntityManagerFactory или что угодно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню