Кто должен видеть, кто в приложении JPA? - PullRequest
0 голосов
/ 13 октября 2009

У меня есть код с использованием JPA, и все отлично работает в моей среде разработки и в модульных тестах. Но, развертывая мои модули в целевой среде OSGi, я регулярно сталкиваюсь с самыми странными проблемами загрузки классов. Мне очень нравится OSGi, но если я не смогу это исправить раз и навсегда, я сойду с ума. И до тех пор, пока я не понимаю, какие классы нужно видеть, какими другими классами я никогда не буду правильно настраивать OSGi.

Итак, насколько я вижу, у меня есть следующие элементы, которые могут или не могут быть видны из некоторого фрагмента кода, давайте назовем их «субъектами»:

  • JPA аннотированные классы сущностей
  • a persistence.xml
  • постоянство API в javax.persistence
  • классы персистентных провайдеров

И в моем коде есть следующие ситуации:

  • создать EntityManagerFactory и EntityManager
  • создание экземпляров новых объектов
  • передача этих объектов в EntityManager, чтобы поместить их в контекст постоянства
  • продолжайте использовать их, время от времени прося EntityManager сохранить изменения
  • создание, использование и удаление объектов-сущностей без их сохранения в базе данных или иным образом явного вызова методов EntityManager
  • вместо того, чтобы создавать экземпляры объектов сущностей, попросите EM загрузить их из базы данных, это приводит к тому, что создание экземпляров происходит там, где я этого не вижу.
  • использование, изменение, сохранение и удаление этих экземпляров

Итак, в каких из вышеперечисленных ситуаций мне нужно, чтобы какие предметы были видны?

Наверное, очевидно, что

  • провайдер персистентности и классы сущностей должны знать о javax.persistence
  • код, который создает EntityManager, должен видеть javax.persistence (и я предполагаю, что поставщик сохраняемости, хотя это не видно непосредственно ни в одном из моего собственного кода)

1 Ответ

1 голос
/ 13 октября 2009

Создайте эти связки:

  • Модель (ваши аннотированные классы JPA)
  • Lib (javax.persistence)
  • DAO (persistence.xml, классы поставщика сохраняемости)
  • Бизнес код

Видимость:

  • Модель импорта и экспорта Lib
  • DAO импортирует модель (и, следовательно, Lib). DAO экспортирует методы поиска EM и Model.
  • Импорт бизнес-кода DAO

[EDIT] То, что вы должны понять, это то, как работает загрузка классов OSGi: если у вас есть два пакета A и B, и вы импортируете оба, которые используются в C, то A не может видеть B, а B не может ничего видеть из A. С может видеть оба.

Теперь A и B используют библиотечный комплект X. Если A создает некоторый экземпляр из X и передает его C, который, в свою очередь, передает его B, вы получите ошибки, так как X из A не тот же X, что и из B. Каждый Х полностью инкапсулирован из внешнего мира.

В языке Java: классы из X создаются с использованием разных загрузчиков классов, и даже если имя одинаковое, классы из разных загрузчиков классов никогда одинаковы.

Вот почему вы должны избегать импорта X из двух разных путей.

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