You don't say how many contacts you are adding to the campaign <<-->> contacts 
relationship, but based on the description of you problem I am assuming it is 
huge, way beyond 10,000, maybe beyond 100,000 or 1,000,000.

In any case, it seems like you are hitting the EOF huge to-many relationship 
(EOF comparing the previous huge NSArray of to-many items to the new huge 
changed to-many item NSArray) problem….   and yes, this kills performance. For 
simple to-many     A<-->> B   solving it is a little easier. For many-to-many, 
it is solved in a similar way.


So you have something like the following, where xxcampaigncontact is the 
assumed name of the "join" entity:

        campaign  <-->>  xxcampaigncontact <<--> contact

You need to change your EOModel as follows by deleting both the "contacts" item 
and the grayed out 'xxcampaigncontact' items in the relationship section of the 
'campaign' entity. Thus you are removing the offending huge to-many between 
campaign and xxcampaigncontact.

        campaign  <--  xxcampaigncontact <<--> contact

Then you will need to write business logic methods in your campaign.java class 
to fetch contacts and do other contact manipulation using "reverse 
relationship" (contact to campaigns) manipulation logic.

For example, you may want to add a contactsQualifier() method to campaign that 
will look like this:

        protected EOQualifier _contactsQualifier;

        public EOQualifier contactsQualifier() {
                if (_contactsQualifier == null) {
                        _contactsQualifier = 
Contact.CAMPAIGNS_KEY.containsObject(this);
                }
                return _contactsQualifier;
        }

And then to fetch a campaign's contacts, use a fetch spec having the qualifier 
above.

To add contacts to a campaign's contacts, you convenience method in your 
campaign.java to add the campaign to a contact's campaigns relationship instead.

        contact.addToCampaignsRelationship( campaign );

In the case of a regular huge to-many relationship, a convenience class like 
ERXUnmodeledToManyRelationship can be used. Referring to this may help you get 
your head around your current problem.

HTH, Kieran



On Sep 20, 2011, at 2:56 AM, Jérémy DE ROYER [INGENCYS] wrote:

> Hi All,
> 
> I have an editing context question.
> 
> I've got 2 tables : contact and compaign
> 
> I want to add contacts to a compaign so I've created a many to many 
> relationship between the table contact and the table compaign. That work fine.
> 
> Problem is that when I add (lots of) contacts to a compaign because 
> webobjects, when updating database with saveChanges(), update all contacts in 
> database (even if fields of contacts haven't been changed).
> 
> For table with 5 rows, I takes 20 secondes for 1000 added contacts, that's ok.
> 
> But for table with more than 50 rows, I takes more than 2 minutes.
> 
> What's the best solution to avoid that wast of time (that make problem when 
> submitting form that takes to many time... for nothing)
> 
> I though about :
> - creating "linking" table with no data row to avoid long save, but I have to 
> change all my model...
> - remove contact from updatedObjects set, but that's dirty because willUpdate 
> methods won't be called
> 
> Any idea to avoir SQL update on objects that didn't changes except to Many 
> Relationship ?
> 
> Jérémy _______________________________________________
> Do not post admin requests to the list. They will be ignored.
> Webobjects-dev mailing list      ([email protected])
> Help/Unsubscribe/Update your Subscription:
> http://lists.apple.com/mailman/options/webobjects-dev/kelleherk%40gmail.com
> 
> This email sent to [email protected]

 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      ([email protected])
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to