At 18:30 30/12/00, you wrote:
>Please tell me how to cache the data source.
>But I don't know why EJB can't delete the row from table account.
>Thank you.
You can do it in setEntityContext. Heres some sample code:
public class CategoryBean extends CategoryInfo implements EntityBean {
private transient boolean isDirty = false;
private EntityContext context;
private DataSource ds = null;
private static final String dsName = "java:/craigd";
/**
* Set the entity context for this bean and lookup the DataSource.
*/
public void setEntityContext(final EntityContext context)
throws EJBException, RemoteException {
log("in setEntityContext()");
this.context = context;
try {
InitialContext ic = new InitialContext();
ds = (DataSource)ic.lookup(dsName);
}
catch (Exception e) {
throw new EJBException("Unable to get datasource:" +
e.getMessage());
}
}
and then use it like this:
public String ejbCreate(String categoryID, String categoryName)
throws RemoteException, CreateException {
Connection conn = null;
PreparedStatement pstmt = null;
log("in ejbCreate()");
try {
conn = ds.getConnection();
etc. etc. etc.
}
catch (SQLException e) {
throw new CreateException("ejbCreate: " + e.getMessage());
}
finally {
try { pstmt.close(); } catch (Exception ex) { }
try { conn.close(); } catch (Exception ex) { }
}
}
cheers
craig
>And I find if I start a session to oracle by scott/tiger through
>sql*plus,then start the test client,
>the application will freeze.
>
>levels
>
>-----ԭʼ�ʼ�-----
>������: [EMAIL PROTECTED]
>[mailto:[EMAIL PROTECTED]]���� Jay Walters
>����ʱ��: 2000��12��30�� 2:49
>�ռ���: 'jBoss'
>����: RE: [jBoss-User] why ejbcreate doesn't insert rows into table?
>
>
>I don't believe you should be allocating a database connection in the
>ejbActivate. You can cache the data source so you don't have to do the JNDI
>lookup everytime. It sounds like in the end it's doing the right thing,
>inserting 4 records. I would try and allocate the connection from within
>the transaction and close it before the end. I am guessing this will get
>things working as you expect.
>
>Cheers
>Jay Walters
>
>-----Original Message-----
>From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]]
>Sent: Friday, December 29, 2000 6:23 AM
>To: [EMAIL PROTECTED]
>Subject: [jBoss-User] why ejbcreate doesn't insert rows into table?
>
>
> 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(StreamRemoteC
>all.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(Unkno
>wn 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��?��&
>
>
>--
>--------------------------------------------------------------
>To subscribe: [EMAIL PROTECTED]
>To unsubscribe: [EMAIL PROTECTED]
>List Help?: [EMAIL PROTECTED]
>ininining-ing-dogs.com
>List Help?: [EMAIL PROTECTED]
>N�.n�+���n�,�ǫ�yb��(�H��� ��&N�����r��z6�ˬz�~X��
>+�)�v�,r����GzZc�|(�H��� ��&��
--
--------------------------------------------------------------
To subscribe: [EMAIL PROTECTED]
To unsubscribe: [EMAIL PROTECTED]
List Help?: [EMAIL PROTECTED]