2014-06-11 50 views
0

我正在爲我的大學開發一個研究項目的應用程序,該應用程序是使用Eclipse和eclipselink JPA在Java中開發的,用於存儲持久性。該應用程序由3個Eclipse項目組成,稱其爲簡單的A,B和C.項目A和C使用JPA訪問其數據庫DB_A和DB_C。項目A使用內置的Java derby數據庫,項目C使用MySQL數據庫。 項目A和C都定義了一些實體和一個實體管理器。在每個項目中進行測試時,操作都可以正常工作然後,將項目C添加爲項目B的參考,項目B添加到項目A.(A-> B-> C) 項目A(主應用程序)使用本地數據庫DB_A並需要訪問項目B的功能,調用連接到第二個數據庫DB_C的項目C.這是當出現以下異常,從項目Ç拋出(在此之前能正常工作):未知的實體bean類,請驗證此類是否已使用@Entity註釋標記

異常在線程「線程0」 java.lang.IllegalArgumentException異常:未知 實體bean類:類database.model.VMModelSim ,請確認此 類已標記了@Entity註釋。

at org.eclipse.persistence.internal.jpa.EntityManagerImpl.find(EntityManagerImpl.java:707) 

    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.find(EntityManagerImpl.java:588) 

    at database.dao.DAO.find(DAO.java:40) 

    at database.facade.FacadeImpl.find(FacadeImpl.java:32) 

    at simulationmanager.services.VMServiceImpl.getById(VMServiceImpl.java:89) 

    at simulationmanager.services.VMServiceImpl.getById(VMServiceImpl.java:1) 

    at monitoring.util.ResourceAdapter.updateResource(ResourceAdapter.java:29) 

    at monitoring.QueueProcessor.writeMessageToDB(QueueProcessor.java:58) 

    at monitoring.QueueProcessor.run(QueueProcessor.java:44) 

每個項目A和C有自己的persistance.xml文件,是持久性單元名稱的不同,類中聲明和數據庫驅動程序。

這是項目A的持久化XML文件

<?xml version="1.0" encoding="UTF-8" ?> 
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
    version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"> 
    <persistence-unit name="todos" transaction-type="RESOURCE_LOCAL"> 
    <class>database.model.Server</class> 
    <class>database.model.VirtualMachine</class> 
    <class>database.model.CPU</class> 
    <class>database.model.CPUCore</class> 
    <class>database.model.HDD</class> 
    <class>database.model.RAM</class> 
    <class>database.model.DataCenter</class> 
    <class>database.model.Rack</class> 
    <properties> 
     <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver" /> 
     <property name="javax.persistence.jdbc.url" 
     value="jdbc:derby:/var/lib/one/workspace/databases/cloudDatabase;create=true" /> 
     <property name="javax.persistence.jdbc.user" value="test" /> 
     <property name="javax.persistence.jdbc.password" value="test" /> 

     <!-- EclipseLink should create the database schema automatically --> 
     < <property name="eclipselink.ddl-generation" value="create-or-extend-tables" /> > 
     <property name="eclipselink.ddl-generation.output-mode" 
     value="database" /> 
    </properties> 

    </persistence-unit> 
</persistence> 

我能做些什麼來解決這個問題?該實體標有@Entity。如果只訪問一個數據庫,這些操作就可以正常工作我認爲問題的出現是因爲必須同時訪問兩個數據庫。我們可以修改persistance.xml文件嗎?

+0

您如何定義持久性單元,並且在啓動時是否還有其他警告?持久性單元應該具有唯一的名稱,以便可以將A的持久性單元從C中分離出來。 – Chris

回答

1

我們設法弄清楚了這個問題。在項目A和C中,我們在相同的包名稱中具有相同的數據庫訪問類:包database.connection中的DBConnect.java。在這裏我們定義了持久性管理器名稱(這是不同的!)。 當項目分開運行時,每個項目都訪問自己的連接類。但是,當只運行項目A並引用B和C時,創建與其數據庫的連接的項目C中的類創建了一個項目A中定義的類的對象(因爲名稱相同)。因此,它試圖爲在項目A中定義的模型創建持久性管理器,並編寫在項目C中定義的對象。我相信這是錯誤源。

相關問題