We've got a situation where we need to update entity values using JDBC 
statements and then access them for reading via CMP methods. This is to be done 
within a single stateless session bean method.

I think this is a fairly odd requirement but from what I understand it should 
be possible. Please correct me if I am wrong.

I thought that within a single transacted session method and using the same 
datasource used for CMP when a connection is opened it should be the same as 
used for CMP updates as it should be registered with the method's transaction.

>From the debug logs it doesn't seem to work like this. And to be honest from 
>what I see there I feel I may be missing something fundamental.

We're using JBoss 3.2.2 and Oracle 8.1.7 but have also tried with JBoss 3.2.6

We are using the local-tx-datasource definition for Oracle that comes with 
JBoss.
We have also tried using Hypersonic as a datasource with the same results.

Here is the session method code we're trying to run:

    public void testConnections() {
  | 
  |         Connection conn = null;
  |         
  |         try {
  |             
  |             Context ctx = new InitialContext();
  |             Object o = ctx.lookup("java:comp/env/TestEntityLocal");
  |             TestEntityLocalHome home = (TestEntityLocalHome)o;
  |             
  |         
  |             TestEntityLocal entity = home.create();
  |             System.out.println("testField before setting : " + 
entity.getTestField());
  |             entity.setTestField(new Integer(1000));
  |             System.out.println("testField after setting, before JDBC update 
(CMP view) : " + entity.getTestField());
  | 
  |             DataSource ds = (DataSource)ctx.lookup("java:DefaultDS");
  |             conn = ds.getConnection();
  | 
  |             // JDBC select
  |             int jdbcView = -1;
  |             PreparedStatement statement = conn.prepareStatement("select 
testfield from testentity where id = ?");
  |             statement.setLong(1, entity.getId().longValue());
  |             ResultSet rs = statement.executeQuery();
  |             if (rs.next()) {
  |                 jdbcView = rs.getInt(1);
  |             }
  |             
  |             System.out.println("testField after setting, before JDBC update 
(JDBC view) : " + jdbcView);
  |             rs.close();
  |             statement.close();            
  |             
  |             // JDBC update
  |             statement = conn.prepareStatement("update testentity set 
testfield = ? where id = ?");
  |             statement.setLong(1, 9999);
  |             statement.setLong(2, entity.getId().longValue());
  |             statement.executeUpdate();
  |             
  |             // JDBC select
  |             jdbcView = -1;
  |             statement = conn.prepareStatement("select testfield from 
testentity where id = ?");
  |             statement.setLong(1, entity.getId().longValue());
  |             rs = statement.executeQuery();
  |             if (rs.next()) {
  |                 jdbcView = rs.getInt(1);
  |             }
  |             
  |             System.out.println("testField after JDBC update (JDBC view) : " 
+ jdbcView);
  |             rs.close();
  |             statement.close();
  |         
  |             System.out.println("testField after JDBC update (CMP view) : " 
+ entity.getTestField());
  |     
  |             entity.remove();
  | 
  |             conn.close();
  | 
  |         } catch (Exception e) {
  |             e.printStackTrace();
  |         }
  |         finally {
  |             try {
  |                 conn.close();
  |             } catch (Exception e1) {}
  |         }
  | 
  |         System.out.println("End Test");
  |     }
  | 


The end result is:

  | 20:20:47,094 INFO  [STDOUT] testField before setting : null
  | 20:20:47,101 INFO  [STDOUT] testField after setting, before JDBC update 
(CMP view) : 1000
  | 20:20:47,111 INFO  [STDOUT] testField after setting, before JDBC update 
(JDBC view) : 0
  | 20:20:47,149 INFO  [STDOUT] testField after JDBC update (JDBC view) : 9999
  | 20:20:47,150 INFO  [STDOUT] testField after JDBC update (CMP view) : 1000
  | 20:20:47,173 INFO  [STDOUT] End Test
  | 

Obviously we would want the values to be consistent regardless of the access 
method.

Can anyone give us some insight on this? (before I go mad)

Thanks!



Here is the datasource definition used with Hypersonic:


  | <?xml version="1.0" encoding="UTF-8"?>
  | 
  | <datasources>
  |    <local-tx-datasource>
  | 
  |       <jndi-name>DefaultDS</jndi-name>
  |       <connection-url>jdbc:hsqldb:hsql://localhost:1701</connection-url>
  |       <driver-class>org.hsqldb.jdbcDriver</driver-class>
  |       <user-name>sa</user-name>
  |       <password></password>
  |       <min-pool-size>5</min-pool-size>
  |       <max-pool-size>20</max-pool-size>
  |       <idle-timeout-minutes>5</idle-timeout-minutes>
  |       <track-statements/>
  |       <security-domain>HsqlDbRealm</security-domain>
  |       <prepared-statement-cache-size>32</prepared-statement-cache-size>
  |     </local-tx-datasource>
  |    <mbean code="org.jboss.jdbc.HypersonicDatabase" 
  |      name="jboss:service=Hypersonic">
  |      <attribute name="Port">1701</attribute>
  |      <attribute name="Silent">true</attribute>
  |      <attribute name="Database">default</attribute>
  |      <attribute name="Trace">false</attribute>
  |      <attribute name="No_system_exit">true</attribute>
  |    </mbean>
  | </datasources>
  | 

Here is the ejb-jar.xml :


  | <?xml version="1.0" encoding="UTF-8"?>
  | <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise 
JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd";>
  | 
  | <ejb-jar >
  | 
  |    <description>[CDATA[No Description.]]</description>
  |    <display-name>Generated by XDoclet</display-name>
  | 
  |    <enterprise-beans>
  | 
  |       <!-- Session Beans -->
  |       <session >
  |          <description>[CDATA[Description for 
TestStatelessSession]]</description>
  |          <display-name>Name for TestStatelessSession</display-name>
  | 
  |          <ejb-name>TestStatelessSession</ejb-name>
  | 
  |          <home>test.interfaces.TestStatelessSessionHome</home>
  |          <remote>test.interfaces.TestStatelessSession</remote>
  |          <ejb-class>test.ejb.TestStatelessSessionBean</ejb-class>
  |          <session-type>Stateless</session-type>
  |          <transaction-type>Container</transaction-type>
  | 
  |          <ejb-local-ref >
  |             <ejb-ref-name>TestEntityLocal</ejb-ref-name>
  |             <ejb-ref-type>Entity</ejb-ref-type>
  |             <local-home>test.interfaces.TestEntityLocalHome</local-home>
  |             <local>test.interfaces.TestEntityLocal</local>
  |             <ejb-link>TestEntity</ejb-link>
  |          </ejb-local-ref>
  | 
  |       </session>
  | 
  |        <!-- Entity Beans -->
  |       <entity >
  |          <description>[CDATA[Description for TestEntity]]</description>
  |          <display-name>Name for TestEntity</display-name>
  | 
  |          <ejb-name>TestEntity</ejb-name>
  | 
  |          <local-home>test.interfaces.TestEntityLocalHome</local-home>
  |          <local>test.interfaces.TestEntityLocal</local>
  | 
  |          <ejb-class>test.ejb.TestEntityBean</ejb-class>
  |          <persistence-type>Container</persistence-type>
  |          <prim-key-class>java.lang.Long</prim-key-class>
  |          <reentrant>False</reentrant>
  |          <cmp-version>2.x</cmp-version>
  |          <abstract-schema-name>TestEntity</abstract-schema-name>
  |          <cmp-field >
  |             <description>[CDATA[Getter for CMP Field 
TestField]]</description>
  |             <field-name>testField</field-name>
  |          </cmp-field>
  |          <cmp-field >
  |             <description>[CDATA[Getter for CMP Field id]]</description>
  |             <field-name>id</field-name>
  |          </cmp-field>
  |           <primkey-field>id</primkey-field>
  | 
  |       </entity>
  | 
  |     </enterprise-beans>
  | 
  |    <assembly-descriptor >
  |     <container-transaction >
  |       <method >
  |          <ejb-name>TestEntity</ejb-name>
  |           <method-name>*</method-name>
  |        </method>
  |        <trans-attribute>Required</trans-attribute>
  |     </container-transaction>
  |    <container-transaction >
  |       <method >
  |          <ejb-name>TestStatelessSession</ejb-name>
  |           <method-name>*</method-name>
  |        </method>
  |        <trans-attribute>Required</trans-attribute>
  |     </container-transaction>
  |    </assembly-descriptor>
  | 
  | </ejb-jar>

And here is the jboss.xml :

  | <?xml version="1.0" encoding="UTF-8"?>
  | <!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 3.0//EN" 
"http://www.jboss.org/j2ee/dtd/jboss_3_0.dtd";>
  | 
  | <jboss>
  | 
  |    <enterprise-beans>
  | 
  |        <entity>
  |          <ejb-name>TestEntity</ejb-name>
  |          <local-jndi-name>TestEntityLocal</local-jndi-name>
  |          <configuration-name>Standard CMP 2.x 
EntityBean</configuration-name>
  | 
  |       </entity>
  | 
  |       <session>
  |          <ejb-name>TestStatelessSession</ejb-name>
  |          <jndi-name>ejb/TestStatelessSession</jndi-name>
  |          <configuration-name>Standard Stateless 
SessionBean</configuration-name>
  | 
  |       </session>
  | 
  |    </enterprise-beans>
  | 
  |    <resource-managers>
  |    </resource-managers>
  | 
  | </jboss>
  | 



 

View the original post : 
http://www.jboss.org/index.html?module=bb&op=viewtopic&p=3869270#3869270

Reply to the post : 
http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&p=3869270


-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click
_______________________________________________
JBoss-user mailing list
JBoss-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jboss-user

Reply via email to