Antw: Re: Help with optional to-one relationship
Antw: Re: Help with optional to-one relationship
- Subject: Antw: Re: Help with optional to-one relationship
- From: "Andri vonAllmen" <email@hidden>
- Date: Fri, 28 Aug 2009 08:45:58 +0200
Hi Amiel,
As already mentioned, the database has to make the assuption, that
there may be 0..n 'State' records for a 'Seo' record. Hence, you have to
handle the relationship like a to-many relationship.
In other words: First, all 'State' records for a given 'Seo' record
have to be fetched, second, the returned array has to be "analysed".
Since you guarantee that there is only one 'State' record for a given
'Seo' record, the array returned will always contain one object (or no
one if there is no 'State' set for the 'Seo' or multiple 'State' records
if your guarantee is not met).
Something like this should help:
// fetches all 'State' records for a given 'Seo' record
NSArray states() {
return editingContext().objectsWithFetchSpecification(new
EOFetchSpecification("State",
EOQualifier.qualifierWithQualifierFormat("seo = %@", new NSArray(this)),
null));
}
// checks if there is really just one 'State' record for a given 'Seo'
record and returns this one respectively null if there is no 'State'
record or more than one 'State' record available for the given 'Seo'
record
State state() {
NSArray states = states();
if ( states.count() == 1) {
return states.objectAtIndex(0);
}
return null;
}
Regards
Andri von Allmen
>>> Amiel Montecillo <email@hidden> schrieb am Freitag, 28.
August 2009 um
06:18 in Nachricht
<email@hidden>:
> I would agree with you that this relationship is not guaranteed to be
a
> to-one relationship. However, I have coded my app in a way that I
can
> guarantee that it is a to-one relationship.
>
> The only thing is I get that exception when I try to update
state.seo
> properties.
>
> Then I tried to remove the class property of Seo.state(). The
relationship
> is still in tact but I can no longer access seo.state(). This seems
to work,
> but if there is a way that I can keep Seo.state() as a class property
of Seo
> and not get the exception on an update, that will really make my
day.
>
> Thanks Ken for the insight. Anyone else has some other idea?
>
> Amiel
>
> On Fri, Aug 28, 2009 at 12:01 PM, Ken Anderson
<email@hidden>wrote:
>
>> This relationship is not guaranteed to be to-one, since there could
be many
>> States that match the Seo's ID.
>>
>> The way I deal with this is to model it as a to-many relationship,
and
>> write methods in the EO that set/get, enforcing the to-one concept.
>>
>>
>>
>> On Aug 27, 2009, at 10:28 PM, Amiel Montecillo wrote:
>>
>> Hello,
>>>
>>> I have a to-one relationship that is giving me problems when
updating the
>>> destination entity.
>>>
>>> class Seo
>>> {
>>> id; <- PK
>>> title;
>>> description;
>>> state() <- reverse to-one relationship to State
>>> }
>>>
>>> class State
>>> {
>>> id; <- PK
>>> name;
>>> seoid; <- FK to Seo (id)
>>> seo(); <- optional to-one relationship to Seo
>>> }
>>>
>>> When I first enter an Seo to a State, all seems fine, all
properties of
>>> Seo are saved and are related to the corresponding State. But then,
when I
>>> update it I get this exception.
>>>
>>>
>>> Unable to map destination State for relationship state in entity
Seo. To
>>> one relationships must be joined on the primary key of the
destination.
>>> java.lang.IllegalArgumentException: Unable to map destination State
for
>>> relationship state in entity Seo. To one relationships must be
joined on
>>> the primary key of the destination.
>>> at
>>>
>
com.webobjects.eoaccess.EORelationship._sourceRowToForeignKeyMapping(EORelati
> onship.java:1134)
>>> at
>>>
>
com.webobjects.eoaccess.EORelationship._foreignKeyForSourceRow(EORelationship
> .java:1148)
>>> at
>>>
>
com.webobjects.eoaccess.EODatabaseContext._objectFaultWithSnapshotRelationshi
> pEditingContext(EODatabaseContext.java:2346)
>>> at
>>>
>
com.webobjects.eoaccess.EODatabaseContext._fireDeferredFaultWithSourceObject(
> EODatabaseContext.java:2401)
>>> at
>>>
>
com.webobjects.eoaccess.EOAccessDeferredFaultHandler.createFaultForDeferredFa
> ult(EOAccessDeferredFaultHandler.java:49)
>>> at
>>>
>
com.webobjects.eocontrol.EOCustomObject.willReadRelationship(EOCustomObject.j
> ava:1279)
>>> at
>>>
>
er.extensions.eof.ERXGenericRecord.willReadRelationship(ERXGenericRecord.java
> :358)
>>> at
>>>
>
com.webobjects.eocontrol._EOMutableKnownKeyDictionary$Initializer$_LazyGeneri
> cRecordBinding.valueInObject(_EOMutableKnownKeyDictionary.java:614)
>>> at
>>>
>
com.webobjects.eocontrol.EOCustomObject.storedValueForKey(EOCustomObject.java
> :1634)
>>> at
>>>
com.webobjects.eocontrol.EOCustomObject.snapshot(EOCustomObject.java:525)
>>> at
>>>
>
com.webobjects.eocontrol.EOEditingContext.objectWillChange(EOEditingContext.j
> ava:2813)
>>> at er.extensions.eof.ERXEC.objectWillChange(ERXEC.java:769)
>>> at
>>>
>
com.webobjects.eocontrol.EOObserverCenter.notifyObserversObjectWillChange(EOO
> bserverCenter.java:399)
>>> at
>>>
com.webobjects.eocontrol.EOCustomObject.willChange(EOCustomObject.java:333)
>>> at
>>>
>
com.webobjects.eocontrol._EOMutableKnownKeyDictionary$Initializer$_GenericRec
> ordBinding.setValueInObject(_EOMutableKnownKeyDictionary.java:579)
>>> at
>>>
>
com.webobjects.eocontrol.EOCustomObject.takeStoredValueForKey(EOCustomObject.
> java:1663)
>>> at
>>>
>
er.extensions.eof.ERXGenericRecord.takeStoredValueForKey(ERXGenericRecord.jav
> a:1290)
>>> at com.bossing.wo.bids.db._Seo.setDescription(_Seo.java:52)
>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>> at
>>>
>
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>>> at
>>>
>
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.
> java:25)
>>> at java.lang.reflect.Method.invoke(Method.java:597)
>>> at
>>>
>
com.webobjects.foundation.NSKeyValueCoding$ValueAccessor$1.setMethodValue(NSK
> eyValueCoding.java:643)
>>> at
>>>
>
com.webobjects.foundation.NSKeyValueCoding$_MethodBinding.setValueInObject(NS
> KeyValueCoding.java:1150)
>>> at
>>>
>
com.webobjects.eocontrol.EOCustomObject.takeValueForKey(EOCustomObject.java:1
> 529)
>>> at
>>>
>
er.extensions.eof.ERXGenericRecord.takeValueForKey(ERXGenericRecord.java:1282
> )
>>> at
>>>
>
com.webobjects.foundation.NSKeyValueCoding$Utility.takeValueForKey(NSKeyValue
> Coding.java:469)
>>> at
>>>
>
com.webobjects.foundation.NSValidation$DefaultImplementation.validateTakeValu
> eForKeyPath(NSValidation.java:679)
>>> at
>>>
>
com.webobjects.eocontrol.EOCustomObject.validateTakeValueForKeyPath(EOCustomO
> bject.java:1335)
>>> at
>>>
>
com.webobjects.foundation.NSValidation$Utility.validateTakeValueForKeyPath(NS
> Validation.java:502)
>>> at
>>>
>
com.webobjects.foundation.NSValidation$DefaultImplementation.validateTakeValu
> eForKeyPath(NSValidation.java:687)
>>> at
>>>
>
com.webobjects.eocontrol.EOCustomObject.validateTakeValueForKeyPath(EOCustomO
> bject.java:1335)
>>> at
>>>
>
com.webobjects.foundation.NSValidation$Utility.validateTakeValueForKeyPath(NS
> Validation.java:502)
>>>
>>> Is my entity modeling correct? Any ideas how I can resolve this?
>>>
>>> Thanks,
>>> Amiel
>>> --
>>> socket error: unable to connect to 127.0.0.1
>>> _______________________________________________
>>> Do not post admin requests to the list. They will be ignored.
>>> Webobjects-dev mailing list (email@hidden)
>>> Help/Unsubscribe/Update your Subscription:
>>>
>>>
>
>
>>>
>>> This email sent to email@hidden
>>>
>>
>>
--- Disclaimer:
--------------------------------------------------------- This email and
contents is for use only by the intended recipient. If you are not the
individual or entity to whom it is addressed, you are hereby formally
notified that any use, copying or distribution of this email and
attachments, in whole or in part, is strictly prohibited. If you have
received this email in error, please notify the sender and delete the
message and attachment(s) from your system. Any views, opinions or
information, expressed or contained in this email, are those of the
sender and not necessarily reflect those of CEDES. To help protect our
environment, please avoid printing out this information unnecessarily.
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden