Table Of ContentPaterson_656-0 FRONT.fm Page i Thursday, May 4, 2006 9:51 AM
The Definitive Guide
to db4o
■ ■ ■
Jim Paterson, Stefan Edlich,
Henrik Hörning, and Reidar Hörning
Paterson_656-0 FRONT.fm Page ii Thursday, May 4, 2006 9:51 AM
The Definitive Guide to db4o
Copyright © 2006 by Jim Paterson, Stefan Edlich, Henrik Hörning, Reidar Hörning
All rights reserved. No part of this work may be reproduced or transmitted in any form or by any means,
electronic or mechanical, including photocopying, recording, or by any information storage or retrieval
system, without the prior written permission of the copyright owner and the publisher.
ISBN-13: 978-1-59059-656-2
ISBN-10: 1-59059-656-0
Printed and bound in the United States of America 9 8 7 6 5 4 3 2 1
Trademarked names may appear in this book. Rather than use a trademark symbol with every occurrence
of a trademarked name, we use the names only in an editorial fashion and to the benefit of the trademark
owner, with no intention of infringement of the trademark.
Lead Editor: Jason Gilmore
Technical Reviewer: Brian Breneman
Editorial Board: Steve Anglin, Ewan Buckingham, Gary Cornell, Jason Gilmore, Jonathan Gennick,
Jonathan Hassell, James Huddleston, Chris Mills, Matthew Moodie, Dominic Shakeshaft, Jim Sumser,
Keir Thomas, Matt Wade
Project Manager: Kylie Johnston
Copy Edit Manager: Nicole LeClerc
Copy Editor: Liz Welch
Assistant Production Director: Kari Brooks-Copony
Production Editor: Ellie Fountain
Compositor: Susan Glinert Stevens
Proofreader: Linda Seifert
Indexer: Valerie Perry
Artist: Kinetic Publishing Services, LLC
Cover Designer: Kurt Krames
Manufacturing Director: Tom Debolski
Distributed to the book trade worldwide by Springer-Verlag New York, Inc., 233 Spring Street, 6th Floor,
New York, NY 10013. Phone 1-800-SPRINGER, fax 201-348-4505, e-mail [email protected], or
visit http://www.springeronline.com.
For information on translations, please contact Apress directly at 2560 Ninth Street, Suite 219, Berkeley, CA
94710. Phone 510-549-5930, fax 510-549-5939, e-mail [email protected], or visit http://www.apress.com.
The information in this book is distributed on an “as is” basis, without warranty. Although every precaution
has been taken in the preparation of this work, neither the author(s) nor Apress shall have any liability to
any person or entity with respect to any loss or damage caused or alleged to be caused directly or indirectly
by the information contained in this work.
The source code for this book is available to readers at http://www.apress.com in the Source Code section.
Paterson_656-0 FRONT.fm Page iii Thursday, May 4, 2006 9:51 AM
Contents at a Glance
About the Authors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii
About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xix
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xxi
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xxiii
PART I Introduction and Concepts
■ ■ ■
■ CHAPTER 1 Introduction to db4o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
■ CHAPTER 2 Object-Oriented Concepts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
■ CHAPTER 3 Comparing the Object and Relational Data Models . . . . . . . . . . . . . 31
■ CHAPTER 4 OODBMS Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
PART II Working with db4o
■ ■ ■
■ CHAPTER 5 Quick Start . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
■ CHAPTER 6 Querying Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
■ CHAPTER 7 Working with Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
■ CHAPTER 8 Client/Server Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
■ CHAPTER 9 Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
■ CHAPTER 10 Configurations and Tuning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
■ CHAPTER 11 Replication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
■ CHAPTER 12 Advanced Issues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
iii
Paterson_656-0 FRONT.fm Page iv Thursday, May 4, 2006 9:51 AM
PART III db4o in the Real World
■ ■ ■
■ CHAPTER 13 From RDBMS to OODBMS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
■ CHAPTER 14 Technical Considerations When Using db4o . . . . . . . . . . . . . . . . . . 393
■ CHAPTER 15 The Business Case for db4o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409
■ APPENDIX A Working with the ObjectManager . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
■ APPENDIX B Quick Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
■ APPENDIX C Bibliography . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449
■ INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
iv
Paterson_656-0 FRONT.fm Page v Thursday, May 4, 2006 9:51 AM
Contents
About the Authors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii
About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xix
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xxi
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xxiii
PART I Introduction and Concepts
■ ■ ■
■ CHAPTER 1 Introduction to db4o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Transparent Persistence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Object Databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
db4o Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Queries in db4o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Native Queries. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Simple Object Data Access (SODA) . . . . . . . . . . . . . . . . . . . . . . . . . . 12
The ObjectManager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
db4o Application Areas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Complexity. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Mobility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Connectivity. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
The Open Source Advantage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Structure of This Book . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Languages and Versions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
■ CHAPTER 2 Object-Oriented Concepts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Encapsulation and Information Hiding . . . . . . . . . . . . . . . . . . . . . . . . 17
Responsibilities and Collaboration . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Messages. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
v
Paterson_656-0 FRONT.fm Page vi Thursday, May 4, 2006 9:51 AM
vi ■ CONTENTS
Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Class Diagrams. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Creating a Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Creating an Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Sending Messages to Objects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Class Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Polymorphism . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Abstract Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Object Relationships . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
is-a. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
has-a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
uses-a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Design Patterns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
■ CHAPTER 3 Comparing the Object and Relational Data Models . . . . . . 31
Data Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
First Generation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Hierarchical Data Model. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Network Data Model. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Second Generation: The Relational Model . . . . . . . . . . . . . . . . . . . . . . . . . 35
Data Access in the Relational Model . . . . . . . . . . . . . . . . . . . . . . . . . 35
Using the Relational Model with Procedural Programs . . . . . . . . . . 36
Using the Relational Model with Object-Oriented Programs . . . . . . 36
Third Generation: “Post-Relational” Models . . . . . . . . . . . . . . . . . . . . . . . 37
The Object Data Model. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
The Object-Relational Model. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Fitting Objects into a Relational Database . . . . . . . . . . . . . . . . . . . . . . . . . 39
Aggregation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Inheritance. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Many-Many Relationships. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Complex Relationships. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Referential Integrity and All That . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Queries. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Referential Integrity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Isolation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Paterson_656-0 FRONT.fm Page vii Thursday, May 4, 2006 9:51 AM
■ CONTENTS vii
■ CHAPTER 4 OODBMS Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Object Identity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Equivalence and Equality. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Objects and Literals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Extent. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
The Database Schema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Properties and Relationships. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Methods. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Class Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Object Relationships . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Storing OIDs to Represent Relationships . . . . . . . . . . . . . . . . . . . . . . 51
Inverse Relationships. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Defining the Relationships. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Integrity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Depth of Equality. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Common Types of Object Relationships . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
One-to-Many Relationships. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Many-to-Many Relationships . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Inheritance. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Indexing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
What Do You Get from a Query?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
OQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Native Queries. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Transactions and Concurrency . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
PART II Working with db4o
■ ■ ■
■ CHAPTER 5 Quick Start . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
C# or Java? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
Installing db4o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Installing db4o for C#. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Using db4o in a C# Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Installing db4o for Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Using db4o in a Java Project. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Paterson_656-0 FRONT.fm Page viii Thursday, May 4, 2006 9:51 AM
viii ■ CONTENTS
Running db4o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Creating the Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
Starting the Database. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
db4o Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Storing Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Closing the Database. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Retrieving Objects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Updating Objects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Deleting Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Startup Options. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
A Complete Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Getting Started with the ObjectManager . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Using the ObjectManager to Query Your Objects . . . . . . . . . . . . . . . 90
Troubleshooting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
■ CHAPTER 6 Querying Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Query by Example (QBE) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Simple Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
Constraining Fields. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
More Ways of Matching. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Limitations and Caveats. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Native Queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Query Languages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
The Programming Language As the Query Language . . . . . . . . . . 101
Using Native Queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
More Complex Queries. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
Sorting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Optimization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Using Query Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
SODA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
SODA Query Graphs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
SODA Keywords . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
Using SODA. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
Using Constraints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
Advanced SODA Syntax. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
Paterson_656-0 FRONT.fm Page ix Thursday, May 4, 2006 9:51 AM
■ CONTENTS ix
■ CHAPTER 7 Working with Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Meet the Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Simple Structured Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
Storing and Retrieving Simple Structured Objects . . . . . . . . . . . . . . . . . 134
Queries. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Updating and Deleting Simple Structured Objects . . . . . . . . . . . . . . . . . 139
Deleting Simple Structured Objects . . . . . . . . . . . . . . . . . . . . . . . . . 141
Object Activation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Object Hierarchies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
Deep Queries. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
Objects with Inverse Associations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
Objects with Multivalued Attributes: Arrays . . . . . . . . . . . . . . . . . . . . . . . 157
Query by Values in the Array. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
More Complex Queries. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
Updating and Deleting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
Objects with Multivalued Attributes: Collections . . . . . . . . . . . . . . . . . . . 164
Storing Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
Query for an Object. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Query by Objects in the Collection . . . . . . . . . . . . . . . . . . . . . . . . . . 169
Updating and Deleting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
Object Activation and Circular References . . . . . . . . . . . . . . . . . . . . . . . . 174
Object Activation and Deep Object Graphs . . . . . . . . . . . . . . . . . . . . . . . 179
A Very Simple Deep Graph. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
Activating the Whole Graph. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
Composite Hierarchies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
■ CHAPTER 8 Client/Server Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
Introduction to db4o Client/Server Modes . . . . . . . . . . . . . . . . . . . . . . . . 195
Networking Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
Server. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
Clients . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
Running the Example. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
Embedded Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
Starting the Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
Server and Client Threads. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
Using a Singleton Registry. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213