我尝试在OpenEJB上运行旧的EJB2系统,并使用Entity Bean访问数据库。当前状态是我可以运行它并可以将SQL发送到Oracle DB(我可以在Oracle中看到会话和SQL),但是没有映射表和列名。
我认为原因是OpenEJB无法找到表和列的映射,我按照这篇文章来配置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 :(得分:0)
我找到了一个解决方法,因为我发现JPA创建了一些新表(命名为*** TblBean)。它使用Java对象的命名作为表和列名。因为我们的数据库是Oracle,所以我删除了JPA创建的表,并创建了几个视图来映射到表。它现在有效。
当然,我知道这不是一个好的解决方案,但至少可以起作用。