Как получить имя PersistenceUnit для данного класса сущностей? - PullRequest
2 голосов
/ 14 мая 2011

Я разрабатываю инструмент, который обрабатывает некоторые объекты базы данных, используя JPA2, с hibernate в качестве поставщика сохраняемости.Инструмент является универсальным и не связан с какой-либо бизнес-логикой, для его работы требуется универсальный параметр Class<? extends Task>, где Task - это интерфейс, который я создал, чтобы сказать, что реализующий объект имеет некоторое поведение, интересное моему инструменту.Работа инструмента включает получение экземпляров данного класса из базы данных и манипулирование некоторыми из их свойств.Это универсальный инструмент, потому что он разрабатывается для многократного использования, и у нас есть большой набор классов сущностей (но не все классы сущностей), которые реализуют этот интерфейс (в основном те сущности, которые моделируют некоторые типы работающих бизнес-задач).

Чтобы выполнить работу инструмента, мне нужно получить EntityManager для данного класса.Чтобы получить EntityManager, мне нужно EntityManagerFactory.Чтобы получить EntityManagerFactory, мне нужно имя единицы персистентности.

Итак, моя проблема в том, что с учетом класса сущности получить имя его единицы персистентности.Однако я не нашел никакого способа сделать это без уже существующего EntityManager для этого модуля персистентности, который создает проблему «курица или яйцо сначала, ключ заблокирован внутри сундука».

Частичноерешение состоит в том, чтобы передать имя единицы постоянства вместе с классом сущности, но это выглядит неправильно, поскольку имя единицы постоянства должно быть выведено (или, по крайней мере, предположено) из данного класса.Это можно было бы оптимизировать, добавив имя в аннотацию к классу сущностей, но это все равно выглядит как неправильное решение.Поиск и анализ файла persistence.xml - это то, чего мы действительно хотим избежать.

Итак, что я могу сделать, чтобы решить эту проблему?Есть идеи?

Ответы [ 2 ]

2 голосов
/ 06 июля 2011

Я почти уверен, что невозможно определить единицу сохраняемости, с которой связан класс сущности, потому что дизайн JPA - это наоборот: обычно вы вводите один EntityManagerFactory для конкретной единицы постоянства.

Если у вас есть хотя бы имена всех доступных единиц персистентности, вы можете создать все доступные фабрики, используя Persistence.createEntityManagerFactory(persistenceUnitName), а затем проверить, принадлежит ли определенный класс единице, используя ее метамодель:

for (EntityManagerFactory emf : factories) {
  try {
    EntityType<?> entity = emf.getMetamodel().entity(classToCheck);
    // bingo
  } catch (Exception e) {
    // wrong persistence unit
  }
}

Или вы проверяете MetaModel.getEntities () и строите отображение имени модуля в классы управляемого объекта.

0 голосов
/ 16 мая 2011

Ух ты, я не думаю, что есть идеальный способ делать вещи так, как ты это описываешь.

Единственным источником статической информации, касающейся взаимосвязи сущностей в конкретной единице персистентности, является файл persistence.xml, при условии, что вы объявили классы сущностей там, потому что вы могли бы их опустить и позволить диспетчеру персистентности найтивсе они для вас.

Возможно, вы могли бы организовать свой код таким образом, чтобы было ясно, к какому блоку персистентности относится данный класс.Например, вы могли бы организовать пакеты по единице постоянства или создать пользовательскую аннотацию Java с единицей постоянства, к которой принадлежит данный класс, а затем прочитать аннотацию во время выполнения.

Как это звучит?

Эти идеи - всего лишь способ повторить с другой статической стратегией то, что уже должен знать файл persistence.xml.

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