2016-05-17 3 views
0

У меня есть три связки. В первом пакете у меня есть persistence.xml. И у меня есть два класса: A и B. A extends B. Класс A - @Entity, класс B - это @ MappedSuperclass. Оба класса перечислены в файле persistence.xml. Экспортируются пакеты 2'dn и 3'rd пучков.Eclipselink: комплекты OSGi, наследование и ткачество

Если класс A и класс B находятся в одном комплекте - все в порядке. Однако, когда класс А во втором расслоении и класс В является третьим пакетом я получаю:

WARNING: EMFProxy invocation on method createEntityManager failed: Exception: Exception [EclipseLink-30005] (Eclipse Persistence Services - 2.6.3.v20160428-59c81c5): org.eclipse.persistence.exceptions.PersistenceUnitLoadingException 
Exception Description: An exception was thrown while searching for persistence archives with ClassLoader: [email protected] 
Internal Exception: javax.persistence.PersistenceException: Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.6.3.v20160428-59c81c5): org.eclipse.persistence.exceptions.EntityManagerSetupException 
Exception Description: Predeployment of PersistenceUnit [myPersistenceUnit] failed. 
Internal Exception: java.lang.NullPointerException 
java.lang.NullPointerException: null 
    at org.eclipse.persistence.internal.jpa.weaving.TransformerFactory.createClassDetails(TransformerFactory.java:270) 
    at org.eclipse.persistence.internal.jpa.weaving.TransformerFactory.addClassDetailsForMappedSuperClasses(TransformerFactory.java:124) 
    at org.eclipse.persistence.internal.jpa.weaving.TransformerFactory.buildClassDetailsAndModifyProject(TransformerFactory.java:180) 
    at org.eclipse.persistence.internal.jpa.weaving.TransformerFactory.createTransformerAndModifyProject(TransformerFactory.java:84) 
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:1972) 
    at org.eclipse.persistence.internal.jpa.deployment.JPAInitializer.callPredeploy(JPAInitializer.java:100) 
    at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactoryImpl(PersistenceProvider.java:104) 
    at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory(PersistenceProvider.java:188) 
    at org.eclipse.gemini.jpa.ProviderWrapper.createEntityManagerFactory(ProviderWrapper.java:128) 
    at org.eclipse.gemini.jpa.proxy.EMFServiceProxyHandler.createEMF(EMFServiceProxyHandler.java:151) 
    at org.eclipse.gemini.jpa.proxy.EMFServiceProxyHandler.syncGetEMFAndSetIfAbsent(EMFServiceProxyHandler.java:127) 
    at org.eclipse.gemini.jpa.proxy.EMFServiceProxyHandler.invoke(EMFServiceProxyHandler.java:73) 
    at com.sun.proxy.$Proxy8.createEntityManager(Unknown Source) 

Когда я установил в persistence.xml

<property name="eclipselink.weaving" value="false"/> 

Я не получаю никаких исключений, но все поля из класса B игнорируются. Как решить эту проблему?

+0

Установите журнал EclipseLink на лучший или все и проверьте журналы, поскольку EclipseLink загружает каждый класс во время развертывания, чтобы узнать, собраны ли все ваши классы. Затем он должен показывать любые предупреждения или ошибки, которые могут помешать загрузке «B». – Chris

+0

@ Крис Спасибо за ваше время. Это не помогло, но он дал подсказку - я заметил, что любые классы из одного из пакетов игнорируются и, наконец, выяснили причину. См. Мой ответ. –

+0

@ Крис Кстати, каким-либо образом сделать некоторый набор maven для чтения классов persistence.xml и добавить отсутствующие пакеты для манифеста? Или другие хорошие решения? –

ответ

0

Проблема была в первом комплекте. Он не импортировал пакеты из пакета с классом B, так как его код ничего не знал о классе B. Поэтому мне пришлось добавить файл манифеста первого пакета импорта директив osgi - пакет B. Проблема в EclipseLink заключается в том, что она не выдавала исключений из класса, который не найден или что-то вроде этого, даже с уровнем ведения журнала All.

Смежные вопросы