2011-10-12 81 views
0

我嘗試在OpenEJB上運行一箇舊的EJB2系統,它使用實體Bean訪問數據庫。當前狀態是我可以運行它並可以將SQL發送到Oracle數據庫(我可以在Oracle中看到會話和SQL),但表和列名稱未映射。OpenEJB中的CMP實體bean(OpenJPA?)

我想原因是OpenEJB的找不到表和列映射,我跟着這篇文章來配置

http://www.jarvana.com/jarvana/view/openejb/openejb/0.9.2/openejb-0.9.2.zip!/%5Bdot%5D/openejb-0.9.2/docs/cmp_entity_postgresql.html

C:\ openejb.xml:

<?xml version="1.0"?> 
<openejb> 
    <Container id="Default CMP Container" ctype="CMP_ENTITY"> 
    Global_TX_Database c:/cmp_global_database.xml 
    Local_TX_Database c:/cmp_local_database.xml 
    </Container> 
</openejb> 

cmp_global_database.xml:

<?xml version="1.0"?> 
<database name="Global_TX_Database" engine="oracle"> 
    <jndi name="java:comp/env/jdbc/oracle" /> 
    <mapping href="c:/oracle.cmp_or_mapping.xml" /> 
</database> 

cmp_local_database.xml:

<?xml version="1.0"?> 

<database name="Local_TX_Database" engine="orcle"> 
    <driver class-name="oracle.jdbc.OracleDriver" url="jdbc:oracle:thin:@****:1521:****"> 
    <param name="user" value="****"/> 
    <param name="password" value="****"/> 
    </driver> 
    <mapping href="C:\oracle.cmp_or_mapping.xml"/> 
</database> 

oracle.cmp_or_mapping.xml:

<?xml version="1.0"?> 

<mapping> 
    <class name="com.***.***.***TblBean" identity="id" key-generator="SEQUENCE"> 
    <map-to table="****_TBL"/> 
    <field name="id" type="integer" direct="true"> 
     <sql name="id" type="integer"/> 
    </field> 
    <field name="firstname" type="string" direct="true"> 
     <sql name="first_name" type="varchar" dirty="check"/> 
    </field> 
    <field name="lastname" type="string" direct="true"> 
     <sql name="last_name" type="varchar" dirty="check"/> 
    </field> 
    <field name="email" type="string" direct="true"> 
     <sql name="email" type="varchar" dirty="check"/> 
    </field> 
    </class> 
</mapping> 

這是日誌

[DEBUG] jdbc.JDBC   : SQL Cache missed with key: openejb.com.***.***TblBean in class org.apache.openjpa.jdbc.kernel.JDBCStoreManager  
[DEBUG] jdbc.SQL    : <t 11834440, conn 0> executing prepstmnt 14988216 SELECT t0.acceptDateTime, ... FROM ***TblBean t0 WHERE t0.id = ? [params=(String) ABC.1] 
[DEBUG] jdbc.SQL    : <t 11834440, conn 0> [0 ms] spent 
[DEBUG] jdbc.JDBC   : <t 11834440, conn 0> [0 ms] close 
javax.ejb.ObjectNotFoundException: ***TblBean : ABC.1 
    at org.apache.openejb.core.cmp.CmpContainer.findByPrimaryKey(CmpContainer.java:661) 
    at org.apache.openejb.core.cmp.CmpContainer.invoke(CmpContainer.java:265) 
    at org.apache.openejb.core.entity.EntityEjbHomeHandler.findX(EntityEjbHomeHandler.java:63) 
    at org.apache.openejb.core.ivm.EjbHomeProxyHandler._invoke(EjbHomeProxyHandler.java:172) 
    at org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:282) 

回答

0

我找到了一個解決方法的解決方案,因爲我發現一些新表由JPA創建(命名是*** TblBean)。它使用Java對象的名稱作爲表和列的名稱。而且由於我們的數據庫是Oracle,我放棄了由JPA創建的表格,並創建了幾個視圖映射到表格。它現在有效。

當然,我知道這不是一個好的解決方案,但它至少起作用。