| Preface | p. xv |
| Acknowledgments | p. xviii |
| About this book | p. xxii |
| The basics | p. 1 |
| Bitter choices | p. 3 |
| A storm of controversy | p. 5 |
| A history of EJB antipatterns | p. 6 |
| A case study: Benchmarking PetStore | p. 9 |
| Antipattern: The Golden Hammer | p. 12 |
| Summary: Looking ahead | p. 19 |
| Antipatterns in this chapter | p. 20 |
| The bitter cost | p. 21 |
| Sparking controversy | p. 22 |
| Antipattern: A Sledgehammer for a Fly | p. 30 |
| Entity beans are a horse of a different color | p. 41 |
| Entity beans: Take two | p. 43 |
| Entity beans--a closer look | p. 45 |
| Summary | p. 50 |
| Antipatterns in this chapter | p. 51 |
| Bitter interfaces | p. 52 |
| Building a good interface | p. 53 |
| Designing the application tier | p. 57 |
| Antipattern: Local & Remote Interfaces Simultaneously | p. 60 |
| Antipattern: Customers in the Kitchen | p. 66 |
| Antipattern: Custom DTOs | p. 73 |
| Summary | p. 77 |
| Antipatterns in this chapter | p. 78 |
| Sessions and messages | p. 81 |
| Bitter sessions | p. 83 |
| Threading and synchronization | p. 85 |
| Handling exceptions | p. 92 |
| Iterating large datasets | p. 99 |
| Interoperating efficiently | p. 111 |
| Summary | p. 120 |
| Antipatterns in this chapter | p. 121 |
| Bitter session states | p. 126 |
| Making a case for session state | p. 128 |
| A pivotal antipattern: Conversational Baggage | p. 129 |
| Managing sessions with stateful session beans | p. 134 |
| Managing sessions with servlets | p. 140 |
| Antipattern: Golden Hammers of Session State | p. 143 |
| Mini-antipattern: Stateful Session Beans as Shared Data Caches | p. 151 |
| Antipattern: Session Hodgepodge | p. 152 |
| Mini-antipattern: Session Thrashing | p. 155 |
| Mini-antipattern: Rotting Session Garbage | p. 155 |
| Summary: Taming the beast | p. 156 |
| Antipatterns in this chapter | p. 157 |
| Bitter messages | p. 162 |
| A brief overview of JMS | p. 163 |
| An early antipattern: Fat Messages | p. 165 |
| Mini-antipattern: Skinny Messages | p. 169 |
| Seeds of an order processing system | p. 171 |
| Antipattern: XML as the Silver Bullet | p. 177 |
| Antipattern: Packrat | p. 179 |
| Mini-antipattern: Immediate Reply Requested | p. 182 |
| Using message-driven beans (MDBs) | p. 184 |
| Antipattern: Monolithic Consumer | p. 188 |
| Antipattern: Hot Potato | p. 191 |
| Antipattern: Slow Eater | p. 194 |
| Antipattern: Eavesdropping | p. 195 |
| Antipattern: Performance Afterthoughts | p. 199 |
| Summary: Getting the message | p. 201 |
| Antipatterns in this chapter | p. 202 |
| EJB persistence | p. 211 |
| Bitter entities | p. 213 |
| Understanding entity bean antipatterns | p. 214 |
| Antipattern: Face Off | p. 215 |
| Antipattern: Ham Sandwich; Hold the Ham | p. 222 |
| Antipattern: Application Joins | p. 228 |
| Antipattern: Application Filters | p. 230 |
| Antipattern: Rusty Keys | p. 233 |
| Antipattern: Revolving Doors | p. 235 |
| Summary | p. 239 |
| Antipatterns in this chapter | p. 240 |
| Bitter alternatives | p. 245 |
| Understanding entity bean alternatives | p. 246 |
| Using EJB persistence | p. 249 |
| Simplify with JDBC | p. 260 |
| Using object persistence frameworks | p. 267 |
| Antipattern: Persistent Problems | p. 275 |
| Solution: Do not "inherit" a persistence architecture--choose it | p. 282 |
| Summary | p. 283 |
| Antipatterns in this chapter | p. 284 |
| Broader topics | p. 285 |
| Bitter tunes | p. 287 |
| Measures of success | p. 289 |
| Antipattern: Premature Optimization | p. 291 |
| Antipattern: Performance Afterthoughts | p. 296 |
| Grist for the tuning mill | p. 298 |
| Antipattern: Thrash-tuning | p. 303 |
| Mini-antipattern: Manual Performance Testing | p. 305 |
| Automated performance testing with JUnitPerf | p. 307 |
| Modeling performance | p. 315 |
| Mini-antipattern: Stage Fright | p. 317 |
| Summary: Tuning with confidence | p. 318 |
| Antipatterns in this chapter | p. 319 |
| Bitter builds | p. 324 |
| Wrapping big packages without bows | p. 326 |
| Antipattern: System Loaded Application Classes | p. 332 |
| Antipattern: EJB Code Duplication | p. 332 |
| Antipattern: Build Guru | p. 337 |
| Antipattern: Running with Scissors | p. 339 |
| Antipattern: Integration Hell | p. 341 |
| Summary | p. 342 |
| Antipatterns in this chapter | p. 343 |
| A bittersweet future | p. 348 |
| Marking our place in history | p. 349 |
| Plotting the next moves | p. 351 |
| Antipatterns and next moves | p. 355 |
| Bitter tales | p. 356 |
| A Java development free fall | p. 357 |
| Antipatterns in life | p. 359 |
| Using design patterns accentuates the positive | p. 360 |
| Design patterns online | p. 361 |
| UML provides a language for patterns | p. 362 |
| Antipatterns teach from the negative | p. 362 |
| Some well-known antipatterns | p. 363 |
| Antipatterns in practice | p. 364 |
| Antipattern resources | p. 365 |
| Antipattern ideas are not new | p. 366 |
| Learning from the industry | p. 367 |
| Detective work | p. 368 |
| Refactoring antipatterns | p. 370 |
| Why Bitter Java? | p. 370 |
| The Bitter Java approach | p. 371 |
| Bitter Java tools | p. 371 |
| The Bitter Java organization | p. 372 |
| The Bitter Java audience | p. 373 |
| Looking ahead | p. 374 |
| Bitter basics | p. 376 |
| Developing in the EJB architecture | p. 378 |
| Getting acquainted with the cast, the bean triad | p. 378 |
| Know your host, the EJB container | p. 381 |
| Crafting enterprise beans | p. 384 |
| Defining the client interfaces | p. 385 |
| Implementing the business logic | p. 390 |
| Playing it safe with transactions | p. 397 |
| Configuring the bean | p. 397 |
| Packaging it | p. 399 |
| Invoking your beans from a client | p. 400 |
| Bibliography | p. 401 |
| Index | p. 403 |
| Table of Contents provided by Ingram. All Rights Reserved. |