Creating a Simple Banking Application
Teller : Developing Persistence-Aware Applications
Note |
To
work with any of these samples, you will need the
following: .........................................JDK 1.2 or higher (I use JDK 1.3.1) .........................................PE:JTM - The Productivity Environment for JavaTM (from HYWY Software Corporation) |
Persistence-aware applications are applications
that make use of persistence-capable objects. In theory, programmers responsible
for developing persistence-aware applications can be different from programmers
responsible for constructing the persistence-capable classes. The former deal
with business logic while the latter deal with data modeling. In practice,
depending on the situation, these two groups of programmers could be one and the
same.
The PE:J JDO runtime allows application programmers to manipulate
persistence-capable objects the same way they manipulate common Java objects. In
addition, functions are provided to enable transactional persistence (storage of
objects in a data-store). Application programmers can have a consistent
Java-centric view of persistent data without the need to learn a detailed
data-store-specific query language (SQL, etc.) or many dialect variations of
the query language of different database vendors. As far as the application
programmers are concerned, the actual interactions between the data-store and the
data are transparent. They do not need to know how the actual interactions are
performed behind the scenes, or even what database system is being used.
The java interfaces of JDO are defined in the package javax.jdo.
Persistence-aware applications make use of these interface to access
persistence-capable objects. Furthermore, the PE:J JDO Runtime also provides
convenience classes like the JDOAdapter to pool Persistence Manager
Factory instances, and Oid to generate unique UUIDs. These are found in
the
Note: This article assumes that the reader has already created the simple bank project using PE:J and JDO. |
The following demonstrates how to develop a Persistence-Aware Application that makes use of the JDO Enhanced Persistence-Capable classes and the JDO API.
All persistence-aware applications will need to perform certain common steps. They are:
Obtain a Configured Persistence Manager Factory (PMF) from the JDOAdapter
Use the configured PMF to get a Persistence Manager
Use the Persistence Manager (PM) to obtain a Transaction object
Inserting, selecting, updating or deleting a persistence-capable object
Commiting or rolling back a transaction
Closing the Persistence Manager
Release the Persistence Manager Factory
1. Obtain a Configured PersistenceManagerFactory (PMF) from the JDOAdapter
The Persistence Manager Factory is responsible for creating persistence managers according to pre-configured options and closing them. All options of the PE:J JDO runtime are stored in the Persistence Manager Factory. In addition, pooling of persistence managers is also implemented in the PE:J JDO runtime.
Lines 83 to 93 in the code listing of the Teller class below, provide an example of how to obtain a pre-configured PMF. (It has been reproduced here for your convenience)
Teller.INITIAL_POOL_CAPACITY_, Teller.MAXIMUM_POOL_CAPACITY_, Teller.POOL_CAPACITY_INCREMENT_); try{ pmFactory_ = this.getAdapter().obtainPMF(Teller.PROJECT_NAME_, Teller.DATASTORE_NAME_); }catch(Exception exception){ exception.printStackTrace(); } |
2. Use the configured PMF to get a PersistenceManager
A persistence-aware application must create a persistence manager. The Persistence Manager is a high-level programming interface for managing the states of persistence objects, transactions and queries. An instance of the persistence manager can be obtained from the persistence manager factory. The persistence manager obtained will use the options and connections defined by the persistence manager factory.
Line 125 in the code listing of the Teller class below, provides an example of how to obtain a persistence manager from the PMF. (It has been reproduced here for your convenience)
PersistenceManager pManager = pmFactory_.getPersistenceManager(); |
3. Use the Persistence Manager (PM) to obtain a Transaction object
Usually several operations on persistence-capable objects are grouped as a transaction. A transaction object can be accessed by the method currentTransaction(). A transaction will be started by calling the begin() method.
Line 128 in the code listing of the Teller class below, provides an example of how to obtain a transaction object from the PM, and Line 131 provides an example of how to begin a transaction. (It has been reproduced here for your convenience)
Transaction transaction = pManager.currentTransaction(); // Begin a Transaction transaction.begin(); |
4. Inserting, selecting, updating or
deleting a persistence-capable object
Persistence-capable objects are obtained from the persistence manager. The
values of their fields can be modified thereafter. Once the objects are loaded,
they are saved inside the object cache of the persistence manager. Objects are loaded
on demand. Application programmers do not usually need to manage the object cache
explicitly. Any unused/unreferenced objects are automatically garbage-collected by
the Java runtime.
Line 134 in the code listing of the Teller class below, provides an example of how to insert a new object. (It has been reproduced here for your convenience)
pManager.makePersistent(account); |
Line 196 in the code listing of the Teller class below, provides an example of how to delete a persistence-capable object. (It has been reproduced here for your convenience)
pManager.deletePersistent(account); |
5. Commiting or rolling back a
transaction
When a transaction commits, all the operations on
the persistence objects will be flushed to the data-store. Updates, insertions and
deletions of data in the data-store will be performed if necessary. The
data-store
operations can also be aborted by rolling back a transaction. After committing
the transaction, the persistence manager can be re-used and another new
transaction can be started. At any one time, a persistence manager can deal with
only one transaction.
Lines 136 to 148 in the code listing of the Teller class below, provide an example of how to commit or rollback a transaction. (It has been reproduced here for your convenience)
transaction.commit(); }catch(Exception exception) { // Something bad happened. // If the transaction object was obtained if(transaction != null) { // Rollback the transaction transaction.rollback(); } exception.printStackTrace(); } |
6. Closing the Persistence Manager
Close the persistence manager by calling the close() method. The closed
persistence manager is collected by the factory into its pool of available
persistence managers for future use.
Line 153 in the code listing of the Teller class below, provides an example of
how to close a persistence manager. (It has been reproduced here for your
convenience)
if(pManager != null) { pManager.close(); } |
7. Release the Persistence Manager Factory
Release the persistence manager factory by calling the close() method on the JDOAdapter instance. The released persistence manager factory is collected by the JDOAdapter into its pool of available persistence manager factories for future use.
Line 75 in the code listing of the Teller class below, provides an example of how to close a persistence manager. (It has been reproduced here for your convenience)
|
The class diagram of the Teller class below, lists the attributes, and public methods of the Teller Application.
The code listing of the Teller class below, demonstrates how to develop a Persistence-Aware Application that makes use of the JDO Enhanced Persistence-Capable classes.
Place the following file in the Enhanced Folder that you identified in PE:J
com/hywy/samples/bank/Teller.java | |
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366: 367: 368: 369: 370: 371: 372: 373: 374: 375: 376: 377: 378: 379: 380: 381: 382: 383: 384: 385: 386: 387: 388: 389: 390: 391: 392: 393: 394: 395: 396: 397: 398: 399: 400: 401: 402: 403: 404: 405: 406: 407: 408: 409: 410: 411: 412: 413: 414: 415: 416: 417: 418: 419: 420: 421: 422: 423: 424: 425: 426: 427: 428: 429: 430: 431: 432: 433: 434: 435: 436: 437: 438: 439: 440: 441: 442: 443: 444: 445: 446: 447: 448: 449: 450: 451: 452: 453: 454: 455: 456: 457: 458: 459: 460: 461: 462: 463: 464: 465: 466: 467: 468: 469: 470: 471: 472: 473: 474: 475: 476: 477: 478: 479: 480: 481: 482: 483: 484: 485: 486: 487: 488: 489: 490: 491: 492: 493: 494: 495: 496: 497: 498: 499: 500: 501: 502: 503: 504: 505: 506: 507: 508: 509: 510: 511: 512: 513: 514: |
* author: Gopalan Suresh Raj * Copyright (c), 2002. All Rights Reserved. * URL: https://gsraj.tripod.com/ * email: gopalan@gmx.net * * * To Run the Application * java -classpath * .;C:\PEJ\lib\jdo.jar;C:\PEJ\lib\j2ee.jar;C:\PEJ\lib\pej.jar;C:\PEJ\lib\tools.jar * com.hywy.samples.bank.Teller */ package com.hywy.samples.bank; import com.hywy.pej.adapter.JDOAdapter; import com.hywy.pej.persistence.oidserver.Oid; // Standard JDO Class Library Imports import javax.jdo.PersistenceManagerFactory; import javax.jdo.PersistenceManager; import javax.jdo.Transaction; import javax.jdo.Extent; import javax.jdo.spi.PersistenceCapable; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.ArrayList; import java.text.SimpleDateFormat; import com.hywy.samples.bank.Account; import com.hywy.samples.bank.Checking; import com.hywy.samples.bank.Savings; public class Teller { /** Project Name that was configured using the Console */ public static final String PROJECT_NAME_ = "bank"; /** Datastore Name that was configured using the Console */ public static final String DATASTORE_NAME_ = "bank_datastore"; /** PMF Object pool initial capacity */ public static final int INITIAL_POOL_CAPACITY_ = 1; /** PMF Object pool maximum capacity */ public static final int MAXIMUM_POOL_CAPACITY_ = 10; /** PMF Object pool capacity increment */ public static final int POOL_CAPACITY_INCREMENT_ = 1; /** PersistenceManagerFactory Object */ PersistenceManagerFactory pmFactory_ = null; /** A JDOAdapter instance */ JDOAdapter adapter_; /** * Retrieve the JDOAdapter that holds the PersistenceManagerFactory Object Pool * * @return a JDOAdapter instance that holds the PMF object pool */ public JDOAdapter getAdapter() { return this.adapter_; } /** * Releases the configured PMF and returns it back to the Object Pool, * so that it can be reused by some other process * * @param datastoreName - string denoting the name of the pre-configured datastore * @param pmFactory - PersistenceManagerFactory object that can be released back to the pool */ public void releasePMF(String datastoreName, PersistenceManagerFactory pmFactory) { this.adapter_.close(datastoreName, pmFactory); } /** * Create a new JDOAdapter * */ public Teller() { adapter_ = new JDOAdapter(Teller.PROJECT_NAME_, Teller.INITIAL_POOL_CAPACITY_, Teller.MAXIMUM_POOL_CAPACITY_, Teller.POOL_CAPACITY_INCREMENT_); try{ pmFactory_ = this.getAdapter().obtainPMF(Teller.PROJECT_NAME_, Teller.DATASTORE_NAME_); }catch(Exception exception){ exception.printStackTrace(); } } /** * Create Checking or Savings Account */ public void createAccount(String customerNames, int startingBalance, boolean isCheckingAccount) throws Exception { Account account = null; if(isCheckingAccount == true) { account = new Checking(); } else { account = new Savings(); ((Savings)account).setInterestRate_(2); } account.create(customerNames, startingBalance); //////////////////////////////////// // Perform JDO operations //////////////////////////////////// PersistenceManager pManager = null; Transaction transaction = null; try { // Obtain a Persistence Manager from the Factory Object pManager = pmFactory_.getPersistenceManager(); // Retrieve a Transaction object from the Persistence Manager transaction = pManager.currentTransaction(); // Begin a Transaction transaction.begin(); // Invoke Make Persistent on the object pManager.makePersistent(account); // Commit the transaction transaction.commit(); }catch(Exception exception) { // Something bad happened. // If the transaction object was obtained if(transaction != null) { // Rollback the transaction transaction.rollback(); } exception.printStackTrace(); } finally { // Close the Persistence Manager if(pManager != null) { pManager.close(); } // Release the Persistence Manager Factory if(pmFactory_ != null) { releasePMF(DATASTORE_NAME_, pmFactory_); } } } /** * Delete and close the account */ public void deleteAccount(long accountNumber) throws Exception { Account account = null; //////////////////////////////////// // Perform JDO operations //////////////////////////////////// PersistenceManager pManager = null; Transaction transaction = null; try { // Obtain a Persistence Manager from the Factory Object pManager = pmFactory_.getPersistenceManager(); // Retrieve a Transaction object from the Persistence Manager transaction = pManager.currentTransaction(); // Begin a Transaction transaction.begin(); // Obtain the related PC object account = (Account)pManager.getObjectById(new Oid(accountNumber), true); if(account != null) { // Invoke Delete Persistent on the object pManager.deletePersistent(account); } // Commit the transaction transaction.commit(); }catch(Exception exception) { // Something bad happened. // If the transaction object was obtained if(transaction != null) { // Rollback the transaction transaction.rollback(); } exception.printStackTrace(); } finally { // Close the Persistence Manager if(pManager != null) { pManager.close(); } // Release the Persistence Manager Factory if(pmFactory_ != null) { releasePMF(DATASTORE_NAME_, pmFactory_); } } } /** * Transfer Money */ public boolean transferMoney(long fromAccountNumber, long toAccountNumber, int amount) { boolean result = false; if(amount < 0) { return false; } //////////////////////////////////// // Perform JDO operations //////////////////////////////////// PersistenceManager pManager = null; Transaction transaction = null; try { // Obtain a Persistence Manager from the Factory Object pManager = pmFactory_.getPersistenceManager(); // Retrieve a Transaction object from the Persistence Manager transaction = pManager.currentTransaction(); // Begin a Transaction transaction.begin(); // Obtain the related PC object Account fromAccount = (Account)pManager.getObjectById(new Oid(fromAccountNumber), true); Account toAccount = (Account)pManager.getObjectById(new Oid(toAccountNumber), true); if (fromAccount == null) { throw new Exception("Account Not Found: Account " + fromAccountNumber + " can not be found " + "and funds cannot be transfered from it."); } if (toAccount == null) { throw new Exception("Account Not Found: Account " + toAccountNumber + " can not be found " + "and funds cannot be transfered to it."); } int balance = fromAccount.getBalance_(); if( balance < amount) { throw new Exception("Insufficient Funds: Account "+ fromAccountNumber+ " has a balance of just $"+ balance/100+ ". Cannot transfer $"+ amount/100); } fromAccount.debit(amount); toAccount.credit(amount); // Invoke Make Persistent on the object pManager.makePersistent(fromAccount); pManager.makePersistent(toAccount); // Commit the transaction transaction.commit(); result = true; } catch(Exception exception) { // Something bad happened. // If the transaction object was obtained if(transaction != null) { // Rollback the transaction transaction.rollback(); } result = false; exception.printStackTrace(); } finally { // Close the Persistence Manager if(pManager != null) { pManager.close(); } // Release the Persistence Manager Factory if(pmFactory_ != null) { releasePMF(DATASTORE_NAME_, pmFactory_); } } return result; } /** * List out all Checking accounts found */ public ArrayList listAllCheckingAccounts() { ArrayList list = new ArrayList(); //////////////////////////////////// // Perform JDO operations //////////////////////////////////// PersistenceManager pManager = null; Transaction transaction = null; try { // Obtain a Persistence Manager from the Factory Object pManager = pmFactory_.getPersistenceManager(); Class pcClass = Class.forName("com.hywy.samples.bank.Checking"); Extent extent = pManager.getExtent(pcClass, false) ; Iterator extentIterator = extent.iterator(); while ( extentIterator.hasNext()) { PersistenceCapable checkingPC = (PersistenceCapable)extentIterator.next(); Checking checking = (Checking)checkingPC; Oid currentCheckingOID = null; currentCheckingOID = (Oid)pManager.getTransactionalObjectId(checkingPC); System.out.println("_________________________________________________"); System.out.println("Checking Account for :"+currentCheckingOID.toLong()); System.out.println("Details are :"+checkingPC.toString()); System.out.println("_________________________________________________"); list.add(currentCheckingOID); } } catch(Exception exception) { // Something bad happened. // If the transaction object was obtained if(transaction != null) { // Rollback the transaction transaction.rollback(); } exception.printStackTrace(); } finally { // Close the Persistence Manager if(pManager != null) { pManager.close(); } // Release the Persistence Manager Factory if(pmFactory_ != null) { releasePMF(DATASTORE_NAME_, pmFactory_); } } return list; } /** * List out all Savings accounts found */ public ArrayList listAllSavingsAccounts() { ArrayList list = new ArrayList(); //////////////////////////////////// // Perform JDO operations //////////////////////////////////// PersistenceManager pManager = null; Transaction transaction = null; try { // Obtain a Persistence Manager from the Factory Object pManager = pmFactory_.getPersistenceManager(); Class pcClass = Class.forName("com.hywy.samples.bank.Savings"); Extent extent = pManager.getExtent(pcClass, false) ; Iterator extentIterator = extent.iterator(); while ( extentIterator.hasNext()) { PersistenceCapable savingsPC = (PersistenceCapable)extentIterator.next(); Savings savings = (Savings)savingsPC; Oid currentSavingsOID = null; currentSavingsOID = (Oid)pManager.getTransactionalObjectId(savingsPC); System.out.println("_________________________________________________"); System.out.println("Savings Account for :"+currentSavingsOID.toLong()); System.out.println("Details are :"+savingsPC.toString()); System.out.println("_________________________________________________"); list.add(currentSavingsOID); } } catch(Exception exception) { // Something bad happened. // If the transaction object was obtained if(transaction != null) { // Rollback the transaction transaction.rollback(); } exception.printStackTrace(); } finally { // Close the Persistence Manager if(pManager != null) { pManager.close(); } // Release the Persistence Manager Factory if(pmFactory_ != null) { releasePMF(DATASTORE_NAME_, pmFactory_); } } return list; } public static void main(String [] args) { Teller teller = new Teller(); // try creating new accounts try { teller.createAccount("Gopalan Suresh Raj", 10000000, true); } catch (Exception exception) { exception.printStackTrace(); } try { teller.createAccount("Athul Suresh Raj", 20000000, true); } catch (Exception exception) { exception.printStackTrace(); } try { teller.createAccount("Gopalan Suresh Raj", 910000000, false); } catch (Exception exception) { exception.printStackTrace(); } try { teller.createAccount("Athul Suresh Raj", 2000000000, false); } catch (Exception exception) { exception.printStackTrace(); } List checkingAccountList = teller.listAllCheckingAccounts(); List savingsAccountList = teller.listAllSavingsAccounts(); // Try deleting the first 2 accounts if((checkingAccountList.size() > 0)&&(savingsAccountList.size() > 0)) { try { Oid checkingOid = (Oid)checkingAccountList.get(0); Oid savingsOid = (Oid)savingsAccountList.get(0); teller.deleteAccount(checkingOid.toLong()); teller.deleteAccount(savingsOid.toLong()); checkingAccountList.remove(checkingOid); savingsAccountList.remove(savingsOid); } catch (Exception exception) { exception.printStackTrace(); } } // Try transfering money from one account to the other if((checkingAccountList.size() > 0)&&(savingsAccountList.size() > 0)) { try { Oid fromOid = (Oid)checkingAccountList.get(0); Oid toOid = (Oid)savingsAccountList.get(0); teller.transferMoney(fromOid.toLong(), toOid.toLong(), 100); } catch (Exception exception) { exception.printStackTrace(); } } } } |
JDO Extent
An extent is a JDO construct that is leveraged both for performance and as a basis for JDO object queries. An extent represents all of the instances of a class or a class and its subclasses. Extents could be thought of as collections, but with some room for optimization. A JDO implementation can implement an extent such that only batches of returned objects are actually immediately available in memory. In this case, the remaining objects become populated by the JDO implementation one by one, or in groups, as the iterator encounters objects that are not available in memory. The ability to lazily load objects is an improvement over collections, which can require the JDO provider to load thousands of objects to represent a table.
Lines 403 to 427 in the code listing of the Teller class above, provide an example of how to use a JDO Extent. (It has been reproduced here for your convenience)
pManager = pmFactory_.getPersistenceManager(); Class pcClass = Class.forName("com.hywy.samples.bank.Savings"); Extent extent = pManager.getExtent(pcClass, false) ; Iterator extentIterator = extent.iterator(); while ( extentIterator.hasNext()) { PersistenceCapable savingsPC = (PersistenceCapable)extentIterator.next(); Savings savings = (Savings)savingsPC; Oid currentSavingsOID = null; currentSavingsOID = (Oid)pManager.getTransactionalObjectId(savingsPC); System.out.println("_________________________________________________"); System.out.println("Savings Account for :"+currentSavingsOID.toLong()); System.out.println("Details are :"+savingsPC.toString()); System.out.println("_________________________________________________"); list.add(currentSavingsOID); } |
Note that a JDO extent is retrieved through the persistence manager. The parameters are as follows:
Finally, the extent should be closed. This
closes all iterators over an extent. After this point, all iterators will
return false from their hasNext method.
Upon retrieval of the extent, we get an iterator (just like a collection)
and iterate through the contents. The contents of the collection that are
printed are all of the Savings Accounts that were created.
The Transfer Money Operation
The Transfer Money Object Interaction Diagram is as shown below:
The Transfer Money logic is as follows:
The JDO Client (Teller.java) obtains a configured PersistenceManagerFactory (PMF) from the JDOAdapter.
The JDO Client (Teller.java) uses the configured PMF to get a PersistenceManager.
The JDO Client (Teller.java) uses the Persistence Manager to obtain a Transaction object.
The JDO Client (Teller.java) begins a new Transaction using the Transaction object.
The JDO Client (Teller.java) invokes the credit method on the Checking object.
The JDO Client (Teller.java) then invokes the debit method on the Savings object.
The JDO Client (Teller.java) then commits the transaction by invoking the method in the Transaction object.
The JDO Client (Teller.java) then closes the Persistence Manager.
The JDO Client (Teller.java) then closes the JDOAdapter.
Create a file called Teller.java and place it in the %PEJ_HOME%\projects\bank\enhanced folder. Compile it once again from the PE:J Console. If in doubt, please refer to the Quick Start Guide to see how to do this.
Run the Sample Application.
Command Prompt |
C:\run\projects\bank\enhanced> C:\run\projects\bank\enhanced>java -classpath .;C:\PEJ\lib\jdo.jar;C:\PEJ\lib\j2ee.jar;C:\PEJ\lib\pej.jar;C:\PEJ\lib\tools.jar com.hywy.samples.bank.Teller _________________________________________________ Checking Account for :549810130944 Details are : Account: accountType_= 100 customerNames_= Gopalan Suresh Raj balance_= 10000000 openedOn_= Thu May 23 00:00:00 EDT 2002 _________________________________________________ _________________________________________________ Checking Account for :274932224000 Details are : Account: accountType_= 100 customerNames_= Gopalan Suresh Raj balance_= 100 openedOn_= Thu May 23 00:00:00 EDT 2002 _________________________________________________ _________________________________________________ Checking Account for :412371177472 Details are : Account: accountType_= 100 customerNames_= Athul Suresh Raj balance_= 20000000 openedOn_= Thu May 23 00:00:00 EDT 2002 _________________________________________________ _________________________________________________ Checking Account for :687249084416 Details are : Account: accountType_= 100 customerNames_= Athul Suresh Raj balance_= 20000000 openedOn_= Thu May 23 00:00:00 EDT 2002 _________________________________________________ _________________________________________________ Savings Account for :549793353728 Details are : Account: accountType_= 200 customerNames_= Gopalan Suresh Raj balance_= 910000000 openedOn_= Thu May 23 00:00:00 EDT 2002 Savings: interestRate_= 2 _________________________________________________ _________________________________________________ Savings Account for :274915446784 Details are : Account: accountType_= 200 customerNames_= Gopalan Suresh Raj balance_= 100 openedOn_= Thu May 23 00:00:00 EDT 2002 Savings: interestRate_= 2 _________________________________________________ _________________________________________________ Savings Account for :412354400256 Details are : Account: accountType_= 200 customerNames_= Athul Suresh Raj balance_= 2000000000 openedOn_= Thu May 23 00:00:00 EDT 2002 Savings: interestRate_= 2 _________________________________________________ _________________________________________________ Savings Account for :687232307200 Details are : Account: accountType_= 200 customerNames_= Athul Suresh Raj balance_= 2000000000 openedOn_= Thu May 23 00:00:00 EDT 2002 Savings: interestRate_= 2 _________________________________________________ C:\run\projects\bank\enhanced> |
Download
You can download the entire enhanced folder from here.
click here to go to
My JDO
HomePage...
click here to go
to
My
Advanced Java Tutorial Page...
About the Author... |
Gopalan Suresh Raj is a Software Architect, Developer and an active Author. He has co-authored a number of books including "Professional JMS", "Enterprise Java Computing-Applications and Architecture" and "The Awesome Power of JavaBeans". His expertise spans enterprise component architectures and distributed object computing. Visit him at his Web Cornucopia© site (https://gsraj.tripod.com/) or mail him at gopalan@gmx.net. |
This site was developed and is maintained by Gopalan Suresh Raj This page has been visited times since February 26,2002. |
Last Updated : Feb 26, 2002 |
Copyright (c) 1997-2002, Gopalan Suresh Raj - All rights reserved. Terms of use. |
All products and companies mentioned at this site are trademarks of their respective owners. |