Нет, они не.
Я удалил все остальные аннотации, сократил наследование и получил очень простой класс. Проблема осталась.
В моем сообщении не было упомянуто (потому что я думал, что это не имеет значения), что я запускаю это в контейнере OSGi (Феликс, если это имеет значение). Теперь такой контейнер экранирует разные «связки» друг от друга, поэтому они не могут видеть классы друг друга, пока вы специально не «экспортируете» пакеты.
Аннотированные классы находились в другом пакете, чем мой файл persistence.xml, и я предположил, что я могу просто импортировать аннотированные классы из другого пакета и выполнить инициализацию постоянства в другом месте. Оказывается, я не могу, хотя я не совсем понял, почему.
Итак, если вы используете JPA в сочетании с пакетами OSGi, вы должны убедиться, что:
- Аннотированные классы и файл persistence.xml находятся в одном пакете
- этот пакет экспортирует пакет, содержащий аннотированные классы
- единицы (ы) постоянства перечислены в файле манифеста комплекта
Затем вы можете выполнять фактические действия с постоянством (например, вызывать EntityManager.persist) в разных пакетах.
В качестве дополнительного примечания я получил такие же странные ошибки при попытке использовать аннотации JAXB в связках. Кажется, что JAXBContext и / или ObjectFactory должны быть созданы в том же пакете, который содержит аннотированные классы. На самом деле я не мог это зафиксировать, но складывание вещей в один комплект помогло.
Было бы замечательно, если бы кто-то с более глубоким пониманием OSGi, загрузкой классов и аннотациями мог прокомментировать то, что может происходить здесь.
Обновление : экспорт / импорт надлежащих пакетов аннотаций может позволить вам иметь persistence.xml и аннотированные классы в разных пакетах, см. здесь . Хотя не проверял.