リソースローカルデータソース(Oracle9i)をJBoss5.1.0にデプロイしています。
<datasources>
<local-tx-datasource>
<jndi-name>OracleDS</jndi-name>
<connection-url>jdbc:oracle:thin:@IP_ADDRESS:1521:inv9i</connection-url>
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
<user-name>***</user-name>
<password>***</password>
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
<metadata>
<type-mapping>Oracle9i</type-mapping>
</metadata>
</local-tx-datasource>
</datasources>
永続性ユニット:
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/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_1_0.xsd">
<persistence-unit name="myEJB" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<non-jta-data-source>java:OracleDS</non-jta-data-source>
<class>hr.bel.model.Instrument</class>
<class>hr.bel.model.Order</class>
<class>hr.bel.model.OrderAdditionalData</class>
<class>hr.bel.model.OrderCondition</class>
<class>hr.bel.model.Trade</class>
<class>hr.bel.model.TradeAdditionalData</class>
<class>hr.bel.model.Tradeticker</class>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle9iDialect"/>
<property name="hibernate.hbm2ddl.auto" value="none" />
<property name="hibernate.show_sql" value="true" />
</properties>
</persistence-unit>
</persistence>
MDB内で、onMessageメソッドが呼び出されると、Beanを永続化し、namedQueryを介してそのタイプの最新の5つのBeanをフェッチしようとしています。
@PersistenceContext
EntityManager em = null;
public void onMessage(MyMessage msg) {
Map message = msg.getMessageTree(false);
Instrument instrument = em.find(Instrument.class, 55);
Tradeticker tt = createTradeticker(message);
tt.setInstrument(instrument);
log.info("Persisting tradeticker: " + tt.getTradeType());
em.persist(tt);
log.info("Tradeticker persisted...");
List<Tradeticker> last5 = em.createNamedQuery("getLast5").setParameter(1,instrument.getInstrumentId()).setMaxResults(5).getResultList();
log.info("Persisted tradetickers size: " + last5.size());
}
私の問題は、エラーの痕跡がないのに、Oracleデータベースに永続化されたオブジェクトがないことです。多数のメッセージが送信された後、呼び出しlast5.size()
は0を返します。ログは完全にクリーンです。
私が見つけたMDBの制限は、メソッドでREQUIREDまたはNOT_SUPPORTEDトランザクション属性を使用する必要があることだけです。私のonMessageには注釈が付いていないため、デフォルトでREQUIREDが使用されます。また、MDBクラスにアノテーションがないため、Beanはコンテナ管理のトランザクションを使用する必要があります。
私が間違っているのは何ですか?