2016-05-17 13 views
0

私は3つのバンドルを持っています。最初のバンドルにはpersistence.xmlがあります。クラスAは@Entity、クラスBは@ MappedSuperclassです。クラスはすべてpersistence.xmlにリストされています。 2'dnバンドルと3'rdバンドルのパッケージがエクスポートされます。Eclipselink:OSGiバンドル、継承、織り

クラスAとクラスBが同じバンドルに含まれている場合 - すべて正常です。しかし、ときに、第2のバンドルとクラスBのクラスAは私が得る第三バンドルです:

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のロギングをfinestまたはallに設定し、配備中にEclipseLinkが各クラスをロードする際にログをチェックアウトして、すべてのクラスが選択されているかどうかを確認します。次に、 'B'がロードされないような警告またはエラーが表示されます。 – Chris

+0

@Chrisありがとうございました。それは助けにはならなかったが、それはヒントを与えた - バンドルのいずれかからのクラスが無視され、最終的にその理由が分かったことに気付いた。私の答えを見てください。 –

+0

@Chrisちなみに、いくつかのmavenバンドルをpersistence.xmlクラスを読み込み、存在しないパッケージをマニフェストに追加する方法はありますか?または他の良い解決策? –

答えて

0

問題は最初のバンドルにありました。それは、コードがクラスBについて何も知らなかったので、クラスBのバンドルからパッケージをインポートしませんでした。そこで、最初のバンドルosgiディレクティブインポートパッケージのクラスBパッケージのマニフェストファイルを追加しなければなりませんでした。 EclipseLinkの問題は、クラスが見つからないか、まったくロギングレベルであっても、このような例外はスローされないということです。