On Apr 16, 2012, at 9:13 AM, Johann Werner wrote:
>
> Am 16.04.2012 um 16:43 schrieb Johan Henselmans:
>
>>
>> On Apr 14, 2012, at 10:20 PM, Johan Henselmans wrote:
>>
>>>
>>> On Apr 14, 2012, at 4:17 PM, George Domurot wrote:
>>>
>>>> In your code snip, you aren't adding the newContract object into the
>>>> editing context. To reduce errors like these, always use:
>>>>
>>>
>>> Thanks, after I posted the code I noticed that error and added
>>> eo,insert(newContract)
>>>
>>> It still does not want to run.
>>>
>>> I suppose there is some faulting going on: I noticed that the
>>>
>>> if (contract()==null)
>>>
>>> clause did not get triggered while fetching shows that did not have a
>>> contract.
>>>
>>
>> OK, some reading on Faulting in the Enterprise Objects Framework Developers
>> Guide indeed told me that the relationship contract() would not be null,
>> because of the faulting behaviour (page 205).
>>
>> However, asking for an attribute of a relationship would trigger a round
>> trip to the database and would give me the required error.
>>
>> After a lot of tinkering (I am a big fan, out of necessity of Wonder
>> Tinkering) I cam up with the following solution:
>>
>> public void awakeFromFetch(EOEditingContext eo){
>> super.awakeFromFetch(eo);
>> try{
>> contract().contractDescription();
>> } catch (Exception e){
>> Contract newContract = new Contract();
>> newContract._setValueForPrimaryKey(new
>> Integer(ShowInfo.this.primaryKey()), "contractId");
>> eo.insertObject(newContract);
>> newContract.setContractAmount(new BigDecimal(0.0));
>> newContract.setContractDescription("empty: fake
>> Contract");
>> newContract.setContractRemarks("empty: fake
>> contract"+this._primaryKey);
>> newContract.setContractType(ContractTypeEnum.RENT);
>> eo.saveChanges();
>
> I think here you should be careful saving an editing context you don't know
> what else has been changed in. It would be safer to create a new editing
> context, make a localInstanceIn() and save it there.
I was about to say the same thing. Think about what happens if you're half way
through a wizard page when those things get fetched. It's going to try to save
the changes to the ec and throw a validation exception.
>
>> }
>> }
>>
>> I tried just creating a new contract, and add that to the show, but that
>> did not create the proper primary keys (show owns the contract and
>> Propagates the Primary Key), so some very strange things happened then.
>>
>> Does anybody see any caveats in creating records that are not there like
>> this? (apart from the fact that you should not create records in such a way
>> but via ERMigrations or a perl script or whatever)?
>>
>>>
>>>
>>>> ERXEOControlUtilities.createAndInsertObject
>>>>
>>>> I'd recommend not doing this in awakeFromFetch, but making this a step in
>>>> your migration to clean-up your DB/object graph. 1,500 new objects is a
>>>> light amount of processing and will keep your model object's code clean.
>>>>
>>>> -G
>>>
>>> I know that would be a simpler solution, (and propably will do it) but I
>>> am still curious why the code does not work.
>>>
>>>>
>>>>
>>>> On Apr 14, 2012, at 1:52 AM, Johan Henselmans wrote:
>>>>
>>>>> I am working with shows, that should have contracts.
>>>>>
>>>>> That was only discovered after some shows (let's say 1500) had already
>>>>> been in the database.
>>>>>
>>>>> So I created a new entity Contract, that has a not null relation to show,
>>>>> get's it's primarykey propagated from the show which owns the
>>>>> destination. If the shows is deleted, the contract is deleted (Cascade),
>>>>> like so:
>>>>>
>>>>> <PastedGraphic-9.png>
>>>>>
>>>>> <PastedGraphic-8.png>
>>>>>
>>>>> I thought that with the code:
>>>>>
>>>>> public void awakeFromFetch(EOEditingContext eo){
>>>>> if (contract()==null){
>>>>> Contract newContract = new Contract();
>>>>> newContract.setContractAmount(new BigDecimal(0.0));
>>>>> newContract.setContractDescription("tempDescription");
>>>>> newContract.setContractRemarks("tempRemarks");
>>>>> newContract.setContractType(ContractTypeEnum.RENT);
>>>>> setContractRelationship(newContract);
>>>>> eo.saveChanges();
>>>>> }
>>>>>
>>>>> }
>>>>>
>>>>> In the extended class of the _Show this would make sure that everything
>>>>> gets filled, in the case a contract has not been created as it does with
>>>>> new shows because it is an old show.
>>>>>
>>>>> Alas, that does not seem to be the case. What should I do to create a
>>>>> contract the moment an old show does not have a contract?
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> Vriendelijke Groeten,
>>>>>
>>>>> Johan Henselmans
>>>>> [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:
>>>>> https://lists.apple.com/mailman/options/webobjects-dev/mastermind%40knuckleheads.net
>>>>>
>>>>> This email sent to [email protected]
>>>>
>>>
>>> Vriendelijke Groeten,
>>>
>>> Johan Henselmans
>>> [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:
>>> https://lists.apple.com/mailman/options/webobjects-dev/johan%40netsense.nl
>>>
>>> This email sent to [email protected]
>>
>> Vriendelijke Groeten,
>>
>> Johan Henselmans
>> [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:
> https://lists.apple.com/mailman/options/webobjects-dev/rgurley%40smarthealth.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:
https://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com
This email sent to [email protected]