Re: A better way so save datasets with relations?
"Jerry W. Walker" <[email protected]>
| Newsgroups | gmane.comp.web.webobjects.devel |
|---|---|
| Message-ID | <[email protected]> |
Hi, Helmut,
First, I would suggest renaming your classes to Category and Keyword,
that is, without the "EO" prefix which should be reserved for classes
defined in the EOFrameworks.
Pay careful attention to the first four columns in EOModeler's table
mode when an entity is selected for editing. If we label the four
columns as follows: <key>, <diamond>, <lock>, and <0>, I would
suggest defining your two entities as follows:
<key> <diamond> <lock> <0>
Category
id X
(primary key)
category X X
(varchar)
Keyword
id X
(primary key)
keyword X X
(varchar)
fiCategory X
(id, foreign index of the category)
category X X
(relation, which defines an 1:1 relation between EOKeyword.fiCategory
and EOCategory.id)
Be sure that the category attribute of Keyword is defined as a
relation, that is, when EOModeler is in Table mode, it is displayed
under the lower "Keyword Relationships" section of the Table Mode
view rather than the upper "Keyword Attributes" section.
If you've defined your two entities as above, then, When you want to
save a new Keyword, your code should look as follows:
EOEditingContext ec = session().defaultEditingContext(); //
retrieve the EC
Category categoryObject; // Assume we already have one of these
and that it was retrieved, or created, in the ec EOEditingContext
Keyword newKeyword = (Keyword)
EOUtilities.createAndInsertInstance(ec, "Keyword"); // create and
insert a new instance of Keyword
newKeyword.takeValueForKey(newkeyword, "keyword"); // set the
keyword with a value from a web form
newKeyword.addObjectToBothSidesOfRelationshipWithKey
(categoryObject, "category");
In particular, note that the primary keys for both EOs are NOT class
properties, and therefore, are not visible in your Java code. Let EOF
take care of the keys for you. It tends to be very good at that and
often does less well if you're interfering with it's efforts. :-)
If the code, as I've presented it, raises an exception, please copy
the stack trace when you ask about it. Presuming that you've got a
legitimate categoryObject at the start of the code, that is, one that
was retrieved or created in ec, then it should just work.
Regards,
Jerry
On Jan 4, 2007, at 12:31 PM, Helmut Schottmüller wrote:
> Hi Group,
>
> again a rookie question :-( Sorry for that.
>
> I have created two entities in my application:
>
> EOCategory (which stores a category) and
> EOKeyword (which stores a keyword of a given category)
>
> EOCategory {
> id (primary key)
> category (varchar)
> }
>
> EOKeyword {
> id (primary key)
> keyword (varchar)
> fiCategory (id, foreign index of the category)
> category (relation, which defines an 1:1 relation between
> EOKeyword.fiCategory and EOCategory.id)
> }
>
> so far I think this is the correct way to define a relation in
> EOModeler.
>
> When I want to save a new Keyword I have to do the following:
>
> EOEditingContext ec = session().defaultEditingContext(); //
> retrieve the EC
> EOKeyword newKeyword = (EOKeyword)
> EOUtilities.createAndInsertInstance(ec, "EOKeyword"); // create and
> insert a new instance of EOKeyword
> newKeyword.takeValueForKey(newkeyword, "keyword"); // set the
> keyword with a value from a web form
> NSDictionary result = EOUtilities.primaryKeyForObject(ec,
> categoryObject); // retreive the primary key of the related
> category object
> int pkey = ((Integer)result.objectForKey("id")).intValue(); //
> retreive the primary key of the related category object
> newKeyword.takeValueForKey(new Integer(pkey), "fiCategory"); // set
> the foreign index in the EOKeyword instance
> newKeyword.addObjectToBothSidesOfRelationshipWithKey
> (categoryObject, "category"); // add the relation to the EOKeyword
> instance
>
>
> In the beginning I thought that it should be sufficient to set the
> keyword and to use addObjectToBothSidesOfRelationshipWithKey to set
> the relation because I would expect, that
> addObjectToBothSidesOfRelationshipWithKey takes care of the foreign
> index attribute of the entity. But this didn't work. I always got
> an exception which occured during the validation of the foreign index.
>
> Is this the right way to save a dataset with a relation to the
> database? I doubt that.
> Could someone give me a clue what I can do better?
>
> Thanks in advance,
>
> Helmut_______________________________________________
> WebObjects-dev mailing list
> [email protected]
> http://www.omnigroup.com/mailman/listinfo/webobjects-dev
--
__ Jerry W. Walker,
WebObjects Developer/Instructor for High Performance Industrial
Strength Internet Enabled Systems
[email protected]
203 278-4085 office