Объектный компонент CMP в OpenEJB (OpenJPA?) - PullRequest
0 голосов
/ 12 октября 2011

Я пытаюсь запустить старую систему EJB2 в OpenEJB, и она использует Entity Bean для доступа к базе данных.Текущее состояние: я могу запустить его и отправить SQL в базу данных Oracle (я вижу сеанс и SQL в Oracle), но имя таблицы и столбца не сопоставлено.

Я думаю, что причина в том, что 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)

1 Ответ

0 голосов
/ 14 октября 2011

Я нашел обходное решение, поскольку обнаружил, что JPA создает несколько новых таблиц (имя *** TblBean). Он использует именование Java-объекта в качестве имени таблицы и столбца. И поскольку наша база данных - Oracle, я удалил таблицу, созданную JPA, и создал несколько представлений для сопоставления с таблицей. Это работает сейчас.

Конечно, я знаю, что это не очень хорошее решение, но оно работает по крайней мере.

...