I'm using JBoss 2.0 and oracle8.0.6.I config as BMP.When I use client access 
EJB,the program just check one inserted row.But in fact,I inert 5 rows and remove 1 
row.But when I access oracle through sql*net,there is only one row.After I turn off 
JBoss,I access oracle through
sql*net again,and find that there is 4 rows int the table. I don't know how to solve 
this problem. Please Help me. Thank you.

___________________EJB 
CLASS______________________________________________________________________________________

/*
 *
 * Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
 *
 * This software is the proprietary information of Sun Microsystems, Inc.
 * Use is subject to license terms.
 *
 */
package com.sasgz.ejb.account;

import java.sql.*;
import javax.sql.*;
import java.util.*;
import javax.ejb.*;
import javax.naming.*;

public class AccountEJB implements EntityBean {

    private String id;
    private String firstName;
    private String lastName;
    private double balance;
    private EntityContext context;
    private Connection con;
    private String dbName = "java:comp/env/jdbc/AccountDB";

    public void debit(double amount)
       throws InsufficientBalanceException {

       if (balance - amount < 0) {
           throw new InsufficientBalanceException();
       }
       balance -= amount;
    }

    public void credit(double amount) {

       balance += amount;
    }

    public String getFirstName() {

       return firstName;
    }

    public String getLastName() {

       return lastName;
    }

    public double getBalance() {

       return balance;
    }

    public String ejbCreate(String id, String firstName,
       String lastName, double balance)
       throws CreateException {

       if (balance < 0.00) {
          throw new CreateException
             ("A negative initial balance is not allowed.");
       }

       try {
          insertRow(id, firstName, lastName, balance);
       } catch (Exception ex) {
           throw new EJBException("ejbCreate: " +
              ex.getMessage());
       }

       this.id = id;
       this.firstName = firstName;
       this.lastName = lastName;
       this.balance = balance;

       return id;
    }

   public String ejbFindByPrimaryKey(String primaryKey)
      throws FinderException {

      boolean result;

      try {
         result = selectByPrimaryKey(primaryKey);
       } catch (Exception ex) {
           throw new EJBException("ejbFindByPrimaryKey: " +
              ex.getMessage());
       }
      if (result) {
         return primaryKey;
      }
      else {
         throw new ObjectNotFoundException
            ("Row for id " + primaryKey + " not found.");
      }
   }

   public Collection ejbFindByLastName(String lastName)
      throws FinderException {

      Collection result;

      try {
         result = selectByLastName(lastName);
       } catch (Exception ex) {
           throw new EJBException("ejbFindByLastName " +
              ex.getMessage());
       }

      if (result.isEmpty()) {
         throw new ObjectNotFoundException("No rows found.");
      }
      else {
         return result;
      }
   }

   public Collection ejbFindInRange(double low, double high)
      throws FinderException {

      Collection result;

      try {
         result = selectInRange(low, high);

       } catch (Exception ex) {
           throw new EJBException("ejbFindInRange: " +
              ex.getMessage());
       }
      if (result.isEmpty()) {
         throw new ObjectNotFoundException("No rows found.");
      }
      else {
         return result;
      }
   }

   public void ejbRemove() {

      try {
         deleteRow(id);
       } catch (Exception ex) {
           throw new EJBException("ejbRemove: " +
              ex.getMessage());
       }
   }

   public void setEntityContext(EntityContext context) {

      this.context = context;
      try {
         makeConnection();
      } catch (Exception ex) {
          throw new EJBException("Unable to connect to database. " +
             ex.getMessage());
      }
   }

   public void unsetEntityContext() {

      try {
         con.close();
      } catch (SQLException ex) {
          throw new EJBException("unsetEntityContext: " + ex.getMessage());
      }
   }

   public void ejbActivate() {

      id = (String)context.getPrimaryKey();
   }

   public void ejbPassivate() {

      id = null;
   }

   public void ejbLoad() {

      try {
         loadRow();
       } catch (Exception ex) {
           throw new EJBException("ejbLoad: " +
              ex.getMessage());
       }
   }

   public void ejbStore() {

      try {
         storeRow();
       } catch (Exception ex) {
           throw new EJBException("ejbLoad: " +
              ex.getMessage());
       }
   }


   public void ejbPostCreate(String id, String firstName,
      String lastName, double balance) { }


/*********************** Database Routines *************************/

   private void makeConnection() throws NamingException, SQLException {

      InitialContext ic = new InitialContext();
      DataSource ds = (DataSource) ic.lookup(dbName);
      con =  ds.getConnection();
   }

   private void insertRow (String id, String firstName, String lastName,
                           double balance) throws SQLException {

          String insertStatement =
                "insert into account values ( ? , ? , ? , ? )";
          PreparedStatement prepStmt =
                con.prepareStatement(insertStatement);

          prepStmt.setString(1, id);
          prepStmt.setString(2, firstName);
          prepStmt.setString(3, lastName);
          prepStmt.setDouble(4, balance);

          prepStmt.executeUpdate();
          prepStmt.close();
          System.out.println("insert"+id);
   }

   private void deleteRow(String id) throws SQLException {

      String deleteStatement =
            "delete from account where id = ? ";
      PreparedStatement prepStmt =
            con.prepareStatement(deleteStatement);

      prepStmt.setString(1, id);
      prepStmt.executeUpdate();
      prepStmt.close();
   }

   private boolean selectByPrimaryKey(String primaryKey)
      throws SQLException {

      String selectStatement =
            "select id " +
            "from account where id = ? ";
      PreparedStatement prepStmt =
            con.prepareStatement(selectStatement);
      prepStmt.setString(1, primaryKey);

      ResultSet rs = prepStmt.executeQuery();
      boolean result = rs.next();
      prepStmt.close();
      return result;
   }

   private Collection selectByLastName(String lastName)
      throws SQLException {

      String selectStatement =
            "select id " +
            "from account where lastname = ? ";
      PreparedStatement prepStmt =
            con.prepareStatement(selectStatement);

      prepStmt.setString(1, lastName);
      ResultSet rs = prepStmt.executeQuery();
      ArrayList a = new ArrayList();

      while (rs.next()) {
         String id = rs.getString(1);
         a.add(id);
      }

      prepStmt.close();
      return a;
   }

   private Collection selectInRange(double low, double high)
      throws SQLException {

      String selectStatement =
            "select id from account " +
            "where balance between  ? and ?";
      PreparedStatement prepStmt =
            con.prepareStatement(selectStatement);

      prepStmt.setDouble(1, low);
      prepStmt.setDouble(2, high);
      ResultSet rs = prepStmt.executeQuery();
      ArrayList a = new ArrayList();

      while (rs.next()) {
         String id = rs.getString(1);
         a.add(id);
      }

      prepStmt.close();
      return a;
   }

   private void loadRow() throws SQLException {

      String selectStatement =
            "select firstname, lastname, balance " +
            "from account where id = ? ";
      PreparedStatement prepStmt =
            con.prepareStatement(selectStatement);

      prepStmt.setString(1, this.id);

      ResultSet rs = prepStmt.executeQuery();

      if (rs.next()) {
         this.firstName = rs.getString(1);
         this.lastName = rs.getString(2);
         this.balance = rs.getDouble(3);
         prepStmt.close();
      }
      else {
         prepStmt.close();
         throw new NoSuchEntityException("Row for id " + id +
            " not found in database.");
      }
   }


   private void storeRow() throws SQLException {

      String updateStatement =
            "update account set firstname =  ? ," +
            "lastname = ? , balance = ? " +
            "where id = ?";
      PreparedStatement prepStmt =
            con.prepareStatement(updateStatement);

      prepStmt.setString(1, firstName);
      prepStmt.setString(2, lastName);
      prepStmt.setDouble(3, balance);
      prepStmt.setString(4, id);
      int rowCount = prepStmt.executeUpdate();
      prepStmt.close();

      if (rowCount == 0) {
         throw new EJBException("Storing row for id " + id + " failed.");
      }
   }

} // AccountEJB

________________________________________________HOME 
CLASS________________________________________________________
/*
 *
 * Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
 *
 * This software is the proprietary information of Sun Microsystems, Inc.
 * Use is subject to license terms.
 *
 */
package com.sasgz.ejb.account;

import java.util.Collection;
import java.rmi.RemoteException;
import javax.ejb.*;

public interface AccountHome extends EJBHome {

    public Account create(String id, String firstName,
        String lastName, double balance)
        throws RemoteException, CreateException;

    public Account findByPrimaryKey(String id)
        throws FinderException, RemoteException;

    public Collection findByLastName(String lastName)
        throws FinderException, RemoteException;

    public Collection findInRange(double low, double high)
        throws FinderException, RemoteException;
}

____________________________________________________REMOTE 
CLASS_______________________________________________
/*
 *
 * Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
 *
 * This software is the proprietary information of Sun Microsystems, Inc.
 * Use is subject to license terms.
 *
 */
package com.sasgz.ejb.account;

import javax.ejb.EJBObject;
import java.rmi.RemoteException;

public interface Account extends EJBObject {

    public void debit(double amount)
        throws InsufficientBalanceException, RemoteException;

    public void credit(double amount)
        throws RemoteException;

    public String getFirstName()
        throws RemoteException;

    public String getLastName()
        throws RemoteException;

    public double getBalance()
        throws RemoteException;
}

_________________________________________TEST 
CLIENT______________________________________________________________
/*
 *
 * Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
 *
 * This software is the proprietary information of Sun Microsystems, Inc.
 * Use is subject to license terms.
 *
 */
package com.sasgz.ejb.account;

import java.util.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;

public class AccountClient {

   public static void main(String[] args) {
       // Set up the naming provider; this may not always be necessary, depending
       // on how your Java system is configured.
       System.setProperty("java.naming.factory.initial",
                "org.jnp.interfaces.NamingContextFactory");
       System.setProperty("java.naming.provider.url",
                "localhost:1099");

       try {
           Context initial = new InitialContext();
           Object objref = initial.lookup("MyAccount");

           AccountHome home =
               (AccountHome)PortableRemoteObject.narrow(objref,
                                            AccountHome.class);

           Account duke = home.create("123", "Duke", "Earl", 0.00);
           duke.credit(88.50);
           duke.debit(20.25);
           double balance = duke.getBalance();
           System.out.println("balance = " + String.valueOf(balance));
           duke.remove();

           Account joe = home.create("836", "Joe", "Jones", 0.00);
           joe.credit(34.55);
           Account jones = home.findByPrimaryKey("836");
           jones.debit(2.00);
           balance = jones.getBalance();
           System.out.println("balance = " + String.valueOf(balance));

           Account pat = home.create("456", "Pat", "Smith", 0.00);
           pat.credit(44.77);
           Account john = home.create("730", "John", "Smith", 0.00);
           john.credit(19.54);
           Account mary = home.create("268", "Mary", "Smith", 0.00);
           mary.credit(100.07);

           Collection c = home.findByLastName("Smith");
           Iterator i=c.iterator();

           while (i.hasNext()) {
              Account account = (Account)i.next();
              String id = (String)account.getPrimaryKey();
              double amount = account.getBalance();
              System.out.println(id + ": " + String.valueOf(amount));
           }

           c = home.findInRange(20.00, 99.00);
           i=c.iterator();

           while (i.hasNext()) {
              Account account = (Account)i.next();
              String id = (String)account.getPrimaryKey();
              double amount = account.getBalance();
              System.out.println(id + ": " + String.valueOf(amount));
           }

       } catch (InsufficientBalanceException ex) {
           System.err.println("Caught an InsufficientBalanceException: "
                               + ex.getMessage());

       } catch (Exception ex) {
           System.err.println("Caught an exception." );
           ex.printStackTrace();
       }
   }
}

_________________________________________________ejb-jar.xml___________________________________________

<?xml version="1.0" encoding="Cp1252"?>

<ejb-jar>
  <description>J2EE EJB Examples Application</description>
  <display-name>J2EE Examples</display-name>
  <enterprise-beans>
    <entity>
      <display-name>jBoss AccountJAR application</display-name>
      <ejb-name>AccountBean</ejb-name>
      <home>com.sasgz.ejb.account.AccountHome</home>
      <remote>com.sasgz.ejb.account.Account</remote>
      <ejb-class>com.sasgz.ejb.account.AccountEJB</ejb-class>
      <persistence-type>Bean</persistence-type>
      <prim-key-class>java.lang.String</prim-key-class>
      <reentrant>False</reentrant>
      <resource-ref>
        <res-ref-name>jdbc/AccountDB</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
      </resource-ref>
    </entity>
  </enterprise-beans>
  <assembly-descriptor>
    <container-transaction>
      <method>
        <ejb-name>AccountBean</ejb-name>
        <method-intf>Remote</method-intf>
        <method-name>getLastName</method-name>
        <method-params />
      </method>
      <trans-attribute>Required</trans-attribute>
    </container-transaction>
    <container-transaction>
      <method>
        <ejb-name>AccountBean</ejb-name>
        <method-intf>Remote</method-intf>
        <method-name>credit</method-name>
        <method-params>
          <method-param>double</method-param>
        </method-params>
      </method>
      <trans-attribute>Required</trans-attribute>
    </container-transaction>
    <container-transaction>
      <method>
        <ejb-name>AccountBean</ejb-name>
        <method-intf>Remote</method-intf>
        <method-name>debit</method-name>
        <method-params>
          <method-param>double</method-param>
        </method-params>
      </method>
      <trans-attribute>Required</trans-attribute>
    </container-transaction>
    <container-transaction>
      <method>
        <ejb-name>AccountBean</ejb-name>
        <method-intf>Remote</method-intf>
        <method-name>getBalance</method-name>
        <method-params />
      </method>
      <trans-attribute>Required</trans-attribute>
    </container-transaction>
    <container-transaction>
      <method>
        <ejb-name>AccountBean</ejb-name>
        <method-intf>Home</method-intf>
        <method-name>create</method-name>
        <method-params>
          <method-param>java.lang.String</method-param>
          <method-param>java.lang.String</method-param>
          <method-param>java.lang.String</method-param>
          <method-param>double</method-param>
        </method-params>
      </method>
      <trans-attribute>Required</trans-attribute>
    </container-transaction>
    <container-transaction>
      <method>
        <ejb-name>AccountBean</ejb-name>
        <method-intf>Remote</method-intf>
        <method-name>getFirstName</method-name>
        <method-params />
      </method>
      <trans-attribute>Required</trans-attribute>
    </container-transaction>
  </assembly-descriptor>
</ejb-jar>

________________________________jboss.xml____________________________________________________

<?xml version="1.0" encoding="Cp1252"?>

<jboss>
  <secure>false</secure>
  <container-configurations />
  <resource-managers>
    <resource-manager res-class="org.jboss.ejb.deployment.JDBCResource">
      <res-name>jdbc/AccountDB</res-name>
      <res-jndi-name>OracleORCLPool</res-jndi-name>
    </resource-manager>
  </resource-managers>
  <enterprise-beans>
     <entity>
       <ejb-name>AccountBean</ejb-name>
       <jndi-name>MyAccount</jndi-name>
       <configuration-name></configuration-name>
     </entity>
  </enterprise-beans>
</jboss>

_________________________client error message____________________________
balance = 68.25
Caught an exception.
javax.ejb.ObjectNotFoundException: Row for id 836 not found.
        at 
sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:245)

        at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:220)
        at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:122)
        at 
org.jboss.ejb.plugins.jrmp.server.JRMPContainerInvoker_Stub.invokeHome(Unknown Source)
        at org.jboss.ejb.plugins.jrmp.interfaces.HomeProxy.invoke(HomeProxy.java:221)
        at $Proxy0.findByPrimaryKey(Unknown Source)
        at com.sasgz.ejb.account.AccountClient.main(AccountClient.java:43)

_______________________JBoss message________________________________
[Bean Cache] Passivated overaged bean AccountBean with id = 
nullN�.n�+���n�,�ǫ�yb��(�H��� ��&N�����r��z6�ˬz�~X��
+�)�v�,r����GzZc�|(�H��� ��&

Reply via email to