Changes for page The EOModel

Last modified by Pascal Robert on 2012/03/10 15:42

From version 29.1
edited by Pascal Robert
on 2012/03/10 10:30
Change comment: There is no comment for this version
To version 24.1
edited by Pascal Robert
on 2011/02/27 12:28
Change comment: There is no comment for this version

Summary

Details

Page properties
Content
... ... @@ -1,11 +9,3 @@
1 -{{info}}
2 -
3 -Work in progress! Right now, most of the text is coming from Apple's documentation. We need to change that, and add Wonder and WOLips specific information.
4 -
5 -{{/info}}
6 -
7 -{{toc}}{{/toc}}
8 -
9 9  = The EOModel =
10 10  
11 11  While it may seem obvious, data modeling is perhaps the most important phase of WebObjects application development. Data models form the foundation of your business logic and business logic forms the core of your application. Good business logic is essential to building effective applications, so it follows that good data models are essential to the success of the applications you build. Most importantly, data modeling plays a crucial role in object-relational mapping, the process in which database records are transposed into Java objects.
... ... @@ -19,19 +19,19 @@
19 19  Data models in Enterprise Objects reflect the earliest decisions about what data users see and how they are allowed to interact with data. This is because an important part of data modeling is deciding which entities and attributes are visible to clients and editable by clients. So by including data modeling as an early part of the design process, you can simplify future implementation details.
20 20  
21 21  WebObjects provides you with a great tool for object-relational mapping called EOModeler. It allows you to
22 -■ build data models either from scratch or by analyzing preexisting data sources using reverse engineering
23 -■ add and customize entities (tables) and attributes (columns)
24 -■ form relationships between entities
14 +■ build data models either from scratch or by analyzing preexisting data sources using reverse engineering
15 +■ add and customize entities (tables) and attributes (columns)
16 +■ form relationships between entities
25 25  ■ form relationships across multiple models
26 -■ generate SQL from a model to create or update a data-source schema based on the model
27 -■ generate Java classes from a model in which you can add custom business logic
28 -■ use stored procedures within data models
18 +■ generate SQL from a model to create or update a data-source schema based on the model
19 +■ generate Java classes from a model in which you can add custom business logic
20 +■ use stored procedures within data models
29 29  ■ graphically build fetch specifications for retrieving data
30 -■ flatten attributes and relationships
31 -■ define derived attributes
32 -■ build database queries in raw SQL
22 +■ flatten attributes and relationships
23 +■ define derived attributes
24 +■ build database queries in raw SQL
33 33  
34 -In an Entity-Relationship model, distinguishable things are known as entities, each entity is defined by its component attributes, and the affiliations, or relationships between entities, are identified (together, attributes and relationships are known as properties). From these three simple modeling objects~-~-entities, attributes, and relationships~-~-arbitrarily complex systems can be modeled.
26 +In an Entity-Relationship model, distinguishable things are known as entities, each entity is defined by its component attributes, and the affiliations, or relationships between entities, are identified (together, attributes and relationships are known as properties). From these three simple modeling objectsentities, attributes, and relationshipsarbitrarily complex systems can be modeled.
35 35  
36 36  == Entities ==
37 37  
... ... @@ -72,19 +72,19 @@
72 72  
73 73  === Advanced Entity Inspector ===
74 74  
75 -**Batch Faulting Size** lets you specify the number of faults that should be triggered when you first access an object of this type that is the destination of a to-many relationship. By providing a number in this field, you specify that number of faults of the same entity should be fetched from the data source along with the first fault. This improves performance by minimizing round trips to the data source.
67 +Batch Faulting Size lets you specify the number of faults that should be triggered when you first access an object of this type that is the destination of a to-many relationship. By providing a number in this field, you specify that number of faults of the same entity should be fetched from the data source along with the first fault. This improves performance by minimizing round trips to the data source.
76 76  
77 -**External Query** lets you specify any SQL statement to execute when Enterprise Objects performs an unqualified fetch on the entity. The columns selected by this SQL statement must be in alphabetical order by internal name and must match in number and type with the class properties specified for the entity.
69 +External Query lets you specify any SQL statement to execute when Enterprise Objects performs an unqualified fetch on the entity. The columns selected by this SQL statement must be in alphabetical order by internal name and must match in number and type with the class properties specified for the entity.
78 78  
79 -**Qualifier** is used to specify a restricting qualifier. A restricting qualifier maps an entity to a subset of rows in a table. When you add a restricting qualifier to an entity, it invokes a fetch for that entity to retrieve objects only of the type specified by the restricting qualifier. See "Implementing Single-Table Mapping in a Model" (page 77) for more information on restricting qualifiers.
71 +Qualifier is used to specify a restricting qualifier. A restricting qualifier maps an entity to a subset of rows in a table. When you add a restricting qualifier to an entity, it invokes a fetch for that entity to retrieve objects only of the type specified by the restricting qualifier. See "Implementing Single-Table Mapping in a Model" (page 77) for more information on restricting qualifiers.
80 80  
81 -**Parent** is used to specify a parent entity for the current entity. This field is used to model inheritance. See "Modeling Inheritance" (page 67) for more details on this topic.
73 +Parent is used to specify a parent entity for the current entity. This field is used to model inheritance. See "Modeling Inheritance" (page 67) for more details on this topic.
82 82  
83 -**Read Only** specifies whether the data that's represented by the entity can be altered by your application. This does not lock objects at the database level but rather works at a higher level (in the com.webobjects.eoaccess.EODatabaseContext object) so that if you try to save changes to data that's marked as read only, Enterprise Objects refuses the save and throws an exception.
75 +Read Only specifies whether the data that's represented by the entity can be altered by your application. This does not lock objects at the database level but rather works at a higher level (in the com.webobjects.eoaccess.EODatabaseContext object) so that if you try to save changes to data that's marked as read only, Enterprise Objects refuses the save and throws an exception.
84 84  
85 -**Cache in Memory** specifies that when one record in a table is fetched, the entire table is fetched into memory. Caching an entity's objects allows Enterprise Objects to evaluate queries in memory, thereby avoiding round trips to the data source. This is most useful for read-only entities where there is no danger of the cached data getting out of sync with the data in the data source.
77 +Cache in Memory specifies that when one record in a table is fetched, the entire table is fetched into memory. Caching an entity's objects allows Enterprise Objects to evaluate queries in memory, thereby avoiding round trips to the data source. This is most useful for read-only entities where there is no danger of the cached data getting out of sync with the data in the data source.
86 86  
87 -**Abstract** lets you specify whether the entity is abstract. An abstract entity is one for which no objects are ever instantiated. For example, in the Real Estate database, the User entity is abstract and is never instantiated, whereas entities that inherit from it, such as Agent and Customer, are concrete classes that are instantiated. Like the Parent field, this option is used when modeling inheritance.
79 +Abstract lets you specify whether the entity is abstract. An abstract entity is one for which no objects are ever instantiated. For example, in the Real Estate database, the User entity is abstract and is never instantiated, whereas entities that inherit from it, such as Agent and Customer, are concrete classes that are instantiated. Like the Parent field, this option is used when modeling inheritance.
88 88  
89 89  == Attributes ==
90 90  
... ... @@ -100,14 +100,14 @@
100 100  For example, when you specify Number as the value class for a particular attribute, you are telling Enterprise Objects to use java.lang.Number, which is an abstract class. This is where the value type characteristic steps in. It specifies the exact class an attribute should map to.
101 101  The possible value types for numeric attributes are as follows(note case):
102 102  
103 -■ b~-~--java.lang.Byte
104 -■ s~-~--java.lang.Short
105 -■ i~-~--java.lang.Integer
106 -■ l~-~--java.lang.Long
107 -■ f~-~--java.lang.Float
108 -■ d~-~--java.lang.Double
109 -■ B~-~--java.math.BigDecimal
110 -■ c~-~--java.lang.Boolean
95 +■ bjava.lang.Byte
96 +■ sjava.lang.Short
97 +■ ijava.lang.Integer
98 +■ ljava.lang.Long
99 +■ fjava.lang.Float
100 +■ djava.lang.Double
101 +■ Bjava.math.BigDecimal
102 +■ cjava.lang.Boolean
111 111  
112 112  == Prototypes ==
113 113  
... ... @@ -120,7 +120,7 @@
120 120  ~1. An entity named EOAdaptorNamePrototypes, where AdaptorName is the name of the adaptor for your model. WebObjects 5.2 includes an adaptor for JDBC data sources and an adaptor for JNDI data sources. So you can create a prototype entity called either EOJDBCPrototypes or EOJNDIPrototypes, depending on the adaptor you use.
121 121  2. An entity named EOPrototypes.
122 122  
123 -To create a prototype attribute, first create a prototype entity~-~-an entity named either EOAdaptorNamePrototypes or EOPrototypes~-~-and add an attribute to it. Figure 3-3 shows an attribute in a prototype entity. It shows all the values that prototype attributes can define: column name, value class, external type, and value type.
115 +To create a prototype attribute, first create a prototype entityan entity named either EOAdaptorNamePrototypes or EOPrototypesand add an attribute to it. Figure 3-3 shows an attribute in a prototype entity. It shows all the values that prototype attributes can define: column name, value class, external type, and value type.
124 124  
125 125  To assign a prototype attribute to an attribute, reveal the Prototype column in table mode, and select a prototype attribute from the pop-up menu. The prototype attributes that appear in the pop-up list in the Prototype column include prototype attributes defined in any entity in any model in the application's model group, which includes the current model.
126 126  
... ... @@ -128,13 +128,13 @@
128 128  
129 129  Every relationship has a cardinality. The cardinality defines how many destination records can potentially resolve the relationship. In relational database systems, there are generally two cardinalities:
130 130  
131 -■ to-one relationship~-~--for each source record, there is exactly one corresponding destination record
132 -■ to-many relationship~-~--for each source record, there may be zero, one, or more corresponding destination
123 +■ to-one relationshipfor each source record, there is exactly one corresponding destination record
124 +■ to-many relationshipfor each source record, there may be zero, one, or more corresponding destination
133 133  records
134 134  
135 135  An employeeDepartment relationship is an example of a to-one relationship: An employee can be associated with only one department in a company. An Employee entity might also be associated with a Project entity. In this case, there would be a to-many relationship from Employee to Project called projects since an Employee can have many projects.
136 136  
137 -The construction of a relationship requires that you designate at least one attribute in each entity as a relationship key.
129 +The construction of a relationship requires that you designate at least one attribute in each entity as a relationship key.
138 138  
139 139  There are some general guidelines when choosing which attributes to use as relationship keys. In to-one relationships, the destination key must be a primary key in the destination entity. In to-many relationships, the destination key is usually a foreign key in the destination entity (which is most often a copy of the source entity's primary key). The source key or foreign key should emulate the destination key in that the data types must be the same and the names should be similar.
140 140  
... ... @@ -154,22 +154,22 @@
154 154  
155 155  === Flattened Relations ===
156 156  
157 -A flattened attribute is a special kind of attribute that you effectively add from one entity to another by traversing a relationship. When you form a to-one relationship between two entities (such as Person and PersonPhoto), you can add attributes from the destination table to the source table. For example, you can add a personPhoto attribute to the Person entity. This is called "flattening" an attribute and is equivalent to creating a joined column~-~--it allows you to create objects that extend across tables.
149 +A flattened attribute is a special kind of attribute that you effectively add from one entity to another by traversing a relationship. When you form a to-one relationship between two entities (such as Person and PersonPhoto), you can add attributes from the destination table to the source table. For example, you can add a personPhoto attribute to the Person entity. This is called "flattening" an attribute and is equivalent to creating a joined columnit allows you to create objects that extend across tables.
158 158  
159 159  Flattening attributes is just another way to conceptually "add" an attribute from one entity to another. A generally better approach is to traverse the object graph directly through relationships. Enterprise Objects makes this easy by supporting the notion of key paths.
160 160  The difference between flattening attributes and traversing the object graph (either programmatically or by using key paths) is that the values of flattened attributes are tied to the database rather than the object graph. If an enterprise object in the object graph changes, a flattened attribute can quickly get out of sync.
161 161  
162 -For example, suppose you flatten a departmentName attribute into an Employee object. If a user then changes an employee's department reference to a different department or changes the name of the department itself, the flattened attribute won't reflect the change until the changes in the object graph are committed to the database and the data is refetched (this is because flattened attributes are derived attributes~-~--see "Definition (Derived Attributes)" (page 38) for more details). However, if you're using key paths in this scenario, users see changes to data as soon as they happen in the object graph. This ensures that your application's view of the data remains internally consistent.
154 +For example, suppose you flatten a departmentName attribute into an Employee object. If a user then changes an employee's department reference to a different department or changes the name of the department itself, the flattened attribute won't reflect the change until the changes in the object graph are committed to the database and the data is refetched (this is because flattened attributes are derived attributessee "Definition (Derived Attributes)" (page 38) for more details). However, if you're using key paths in this scenario, users see changes to data as soon as they happen in the object graph. This ensures that your application's view of the data remains internally consistent.
163 163  
164 164  Therefore, you should use flattened attributes only in the following cases:
165 165  
166 166  ■ If you want to combine multiple tables joined by a one-to-one relationship to form a logical unit. For example, you might have employee data that's spread across multiple tables such as ADDRESS, BENEFITS, and so on. If you have no need to access these tables individually (that is, if you'd never need to create an Address object since the address data is always subsumed in the Employee object), then it makes sense to flatten attributes from those entities into the Employee entity.
167 -■ If your application is read-only.
159 +■ If your application is read-only.
168 168  ■ If you're using vertical inheritance mapping. See "Vertical Mapping" (page 69).
169 169  
170 170  === Reflexive Relationships ===
171 171  
172 -A unique kind of relationship is the reflexive relationship~-~--a relationship that shares the same source and destination entity. Reflexive relationships are important when modeling data in which an instance of an entity points to another instance of the same entity.
164 +A unique kind of relationship is the reflexive relationshipa relationship that shares the same source and destination entity. Reflexive relationships are important when modeling data in which an instance of an entity points to another instance of the same entity.
173 173  
174 174  For example, to show who a given person reports to, you could create a separate manager entity. It would be easier, however, to just create a reflexive relationship. The managerID attribute is the relationship's source key whereas employeeID is the relationship's destination key. Where a person's managerID is the employeeID of another employee object, the first employee reports to the second. If an employee doesn't have a manager, the value for the managerID attribute is null in that employee's record.
175 175  
... ... @@ -190,10 +190,10 @@
190 190  ==== Delete Rule ====
191 191  
192 192  The options in the Delete Rule section specify what to do when the source object of a relationship is deleted. There are four options:
193 -■ **Nullify** disassociates all destination objects from the source object by removing references to them. So, when an Agent object is deleted, its related Customer objects are not deleted but the Customer objects' references to Agent are nullified (the entry in the join table is set to null).
194 -■ **Cascade** deletes all objects that are the destination of a relationship whose source is deleted. So, when an Agent object is deleted, all of its related Customer objects are also deleted.
195 -■ **Deny** refuses the deletion if a source object has any destination objects. So, if an Agent object has any Customer objects, deleting the Agent object is denied. In order for the deletion of the Agent object to succeed, its destination objects (Customer objects) must either be deleted or changed to something other than destination objects of the Agent object.
196 -■ **No Action** deletes the destination object but does not remove any back references to the source object. So, if a Customer object is deleted, its reference to its Agent object is not removed. Using this option may result in dangling references in the data source.
185 +■ Nullify disassociates all destination objects from the source object by removing references to them. So, when an Agent object is deleted, its related Customer objects are not deleted but the Customer objects' references to Agent are nullified (the entry in the join table is set to null).
186 +■ Cascade deletes all objects that are the destination of a relationship whose source is deleted. So, when an Agent object is deleted, all of its related Customer objects are also deleted.
187 +■ Deny refuses the deletion if a source object has any destination objects. So, if an Agent object has any Customer objects, deleting the Agent object is denied. In order for the deletion of the Agent object to succeed, its destination objects (Customer objects) must either be deleted or changed to something other than destination objects of the Agent object.
188 +■ No Action deletes the destination object but does not remove any back references to the source object. So, if a Customer object is deleted, its reference to its Agent object is not removed. Using this option may result in dangling references in the data source.
197 197  
198 198  === Tips ===
199 199  
... ... @@ -203,7 +203,7 @@
203 203  
204 204  Relationships can be compound, meaning that they can consist of multiple pairs of connected attributes. You can specify additional pairs of attributes only in the Relationship Inspector. Simply select a second source attribute and a second destination attribute and click Connect a second time.
205 205  
206 -A to-one relationship from one foreign key to a primary key must always have exactly one row in the destination entity~-~--if this isn't guaranteed to be the case, use a to-many relationship. This rule doesn't apply to a foreign key to primary key relationship where a null value for the foreign key in the source row indicates that no row exists in the destination.
198 +A to-one relationship from one foreign key to a primary key must always have exactly one row in the destination entityif this isn't guaranteed to be the case, use a to-many relationship. This rule doesn't apply to a foreign key to primary key relationship where a null value for the foreign key in the source row indicates that no row exists in the destination.
207 207  
208 208  To-one relationships must join on the complete primary key of the destination entity.
209 209  
... ... @@ -233,12 +233,12 @@
233 233  
234 234  {{code}}
235 235  
236 -EOModelGroup modelGroup = EOModelGroup.defaultGroup();
237 -EOFetchSpecification fs = modelGroup.fetchSpecificationNamed("MyFetch", "Listing");
228 +EOModelGroup modelGroup = EOModelGroup.defaultGroup();
229 +EOFetchSpecification fs = modelGroup.fetchSpecificationNamed("MyFetch", "Listing");
238 238  fs = fs.fetchSpecificationWithQualifierBindings(dictionary);
239 -NSMutableDictionary dictionary = new NSMutableDictionary();
240 -dictionary.takeValueForKey("500000", "askingPrice");
241 -dictionary.takeValueForKey("4", "bedrooms");
231 +NSMutableDictionary dictionary = new NSMutableDictionary();
232 +dictionary.takeValueForKey("500000", "askingPrice");
233 +dictionary.takeValueForKey("4", "bedrooms");
242 242  dictionary.takeValueForKey("3", "bathrooms");
243 243  
244 244  {{/code}}
... ... @@ -247,11 +247,11 @@
247 247  
248 248  You can set up an EOModel so that Enterprise Objects automatically invokes a stored procedure for these operations on an entity:
249 249  
250 -**Insert** to insert a new object into an entity
251 -**Delete** to delete an object from an entity
252 -**Fetch All** to fetch all objects in an entity
253 -**Fetch w/ PK** to fetch the object in an entity with a particular primary key
254 -**Get PK** to generate a new primary key for an entity
242 +Insert to insert a new object into an entity
243 +Delete to delete an object from an entity
244 +Fetch All to fetch all objects in an entity
245 +Fetch w/ PKto fetch the object in an entity with a particular primary key
246 +Get PK to generate a new primary key for an entity
255 255  
256 256  The stored procedures you enter in the Stored Procedure Inspector must correspond to a stored procedure in the model. If you created the model from an existing data source and chose the Ask About Stored Procedures option in the wizard, stored procedures are already added to the model. If this is not the case, however, you can add stored procedures to the model using the Add Stored Procedure command from the Property menu.
257 257  
... ... @@ -261,25 +261,25 @@
261 261  
262 262  For each of the operations, if the stored procedure associated with an operation returns a value, Enterprise Objects ignores the return value.
263 263  
264 -For **Fetch All** operations, the stored procedure must not take any arguments and it should return a result set for all the objects in the corresponding entity. The rows in the result set must contain values for all the columns Enterprise Objects would fetch if it were not using the stored procedure, and it must return them in alphabetical order.
256 +For Fetch All operations, the stored procedure must not take any arguments and it should return a result set for all the objects in the corresponding entity. The rows in the result set must contain values for all the columns Enterprise Objects would fetch if it were not using the stored procedure, and it must return them in alphabetical order.
265 265  
266 266  That is, the stored procedure should return values for primary keys, foreign keys used in class property joins, class properties, and attributes used for locking. These values must be returned in alphabetical order with regard to the attributes with which they are associated. For example, consider a Listing entity that has the attributes listingID, bedrooms, and sellingPrice. A stored procedure that fetches all the Listing objects should return the value for a listing's number of bedrooms, then its listingID, and then its selling price.
267 267  
268 -For **Fetch w/ PK** operations, the stored procedure must take an "in" argument for each of the entity's primary key attributes (most entities have a single primary key attribute). The argument names must match the names of the entity's primary key attributes. For example, a Listing entity has a single primary key attribute named listingID, so the stored procedures argument as defined in the model must also be listingID.
260 +For Fetch w/ PK operations, the stored procedure must take an "in" argument for each of the entity's primary key attributes (most entities have a single primary key attribute). The argument names must match the names of the entity's primary key attributes. For example, a Listing entity has a single primary key attribute named listingID, so the stored procedures argument as defined in the model must also be listingID.
269 269  
270 -A **Fetch w/ PK** operation stored procedure should return a result set containing the row that matches the primary key passed in by the argument. The row must be in the same form as rows returned by the Fetch All operation.
262 +A Fetch w/ PK operation stored procedure should return a result set containing the row that matches the primary key passed in by the argument. The row must be in the same form as rows returned by the Fetch All operation.
271 271  
272 -For **Insert** operations, the stored procedure must take an "in" argument for each of the corresponding entity's attributes. The argument names must match the names of the corresponding EOAttribute objects.
264 +For Insert operations, the stored procedure must take an "in" argument for each of the corresponding entity's attributes. The argument names must match the names of the corresponding EOAttribute objects.
273 273  
274 -For **Delete** operations, the stored procedure must take an "in" argument for each of the entity's primary key attributes. The argument names must match the names of the primary key attributes as in a Fetch w/ PK operation stored procedure.
266 +For Delete operations, the stored procedure must take an "in" argument for each of the entity's primary key attributes. The argument names must match the names of the primary key attributes as in a Fetch w/ PK operation stored procedure.
275 275  
276 -For **Get PK** operations, the stored procedure must take an "out" argument for each of the entity's primary key attributes. The argument names must match the names of the primary key attributes as in a Fetch w/ PK operation stored procedure.
268 +For Get PK operations, the stored procedure must take an "out" argument for each of the entity's primary key attributes. The argument names must match the names of the primary key attributes as in a Fetch w/ PK operation stored procedure.
277 277  
278 -**Insert**, **Delete**, and **Get PK** operations should not return a result set.
270 +Insert, Delete, and Get PK operations should not return a result set.
279 279  
280 280  == EO Inheritance ==
281 281  
282 -One of the issues that may arise in designing your enterprise objects~-~-whether you're creating a schema from scratch or working with an existing database schema~-~-is the modeling of inheritance relationships.
274 +One of the issues that may arise in designing your enterprise objectswhether you're creating a schema from scratch or working with an existing database schemais the modeling of inheritance relationships.
283 283  
284 284  In object-oriented programming, it's natural to think of data in terms of inheritance. A Customer object, for example, naturally inherits certain characteristics from a Person object, such as name, address, and phone number. In inheritance hierarchies, the parent object or superclass is usually rather generic so that less generic subclasses of a related type can easily be added. So, in addition to the Customer object, a Client object also naturally derives from a Person object.
285 285  
... ... @@ -321,7 +321,7 @@
321 321  
322 322  ==== Disadvantages of Horizontal Mapping ====
323 323  
324 -Problems may occur when attributes need to be added to the Person superclass. The number of tables that need to be altered is equal to the number of subclasses~-~--the more subclasses you have, the more effort is required to maintain the superclass.
316 +Problems may occur when attributes need to be added to the Person superclass. The number of tables that need to be altered is equal to the number of subclassesthe more subclasses you have, the more effort is required to maintain the superclass.
325 325  
326 326  If, for example, you need to add an attribute called middleName to the Person class, you then need to alter its subclasses, Employee and Customer. So if you have deep inheritance hierarchies or many subclasses, this can be tedious. However, if table maintenance happens far less often than fetches, this might be a viable approach for your application.
327 327  
... ... @@ -340,30 +340,14 @@
340 340  ==== Disadvantages of Single-Table Mapping ====
341 341  
342 342  Single-table mapping results in tables that have columns for all of the attributes of each entity in the inheritance hierarchy. It also results in many null row values. While these aren't really disadvantages, they may conflict with some database design philosophies.
335 +
343 343  
344 -=== Using Inheritance in Entity Modeler ===
345 -
346 -To use Inheritance in your model, you first need to create your base entity. When done, right-click on the entity and select Subclass. A dialog will appear and will ask you to specify which kind of Inheritance you want to use, which entity is the parent and the name of the new (child) entity. When selecting Vertical or Single-Table Inheritance, you can also specify the qualifier (type = XX) in that dialog (you can do that part later too).
347 -
348 348  == EOGenerator ==
349 349  
350 -For many years, a tool called **EOGenerator** was used by many developers to use the Generation Gap Pattern on the Enterprise Objects. Since **EOGenerator** was using a ObjectiveC <-> Java that Apple killed in Mac OS X 10.5, a 100% Java tool, **Veogen**, was added to WOLips, so by default everyone is now using it.
351 -
352 -By using **Veogen**, when you create a new EO entity in your data model, two Java class will be generated, one called //EntityName.java, and the other EntityName.java. The class starting with the underscore will be regenerated every time you modify the entity in the model, if you want to change something in that class, you need to change the template. The class without the underscore is the place where you can add other variables or methods.//
353 -
354 354  == Handling Blob Data ==
355 355  
356 356  == Connection Dictionary ==
357 357  
358 -In each EOModel, you can store one or many database configurations. A database configuration consists of the prototype selection for your database (MySQL, H2, etc.), the adaptor (99% of the time, it's JDBC), the URL (JDBC connection string), the username and password to connect to the datastore, the driver (JDBC driver name) and the name of the EOAdaptor plugin.
359 -
360 -If you wish
361 -
362 -#dbConnectUserGLOBAL=
363 -#dbConnectPasswordGLOBAL=
364 -dbConnectURLGLOBAL = jdbc:h2:file:,,/politimo
365 -dbConnectPluginGLOBAL = H2PlugIn,,
366 -
367 367  == Runtime Selection of the Connection Dictionary and Prototypes ==
368 368  
369 369  == Debugging JDBC Connections and Jdbc2info ==