I sent this over the weekend but I didn’t notice that it was held pending 
approval from the list moderator. I didn’t realize there was a moderator. 
Apparently the message was too big due to the image I had attached showing the 
relevant parts of the model.

I’ve done some code changes and now everything lives in the same EC. But now 
saveChanges() is blowing up

WARN  07/19 21:28:55 (ERXNSLogLog4jBridge.java:44)  - 
<er.extensions.appserver.ERXComponentRequestHandler>: Exception occurred while 
handling request:
java.lang.IllegalStateException: A valid global ID could not be obtained for 
entity named ProductItemPayment, relationship named toProductItems, primary key 
dictionary {oidProductItem = 91; oidPayment = 241; }.
[2015-7-19 21:28:55 EDT] <WorkerThread6> java.lang.IllegalStateException: A 
valid global ID could not be obtained for entity named ProductItemPayment, 
relationship named toProductItems, primary key dictionary {oidProductItem = 91; 
oidPayment = 241; }.
        at 
com.webobjects.eoaccess.EODatabaseContext.databaseOperationForIntermediateRowFromSourceObject(EODatabaseContext.java:4871)
        at 
com.webobjects.eoaccess.EODatabaseContext.recordInsertForIntermediateRowFromSourceObject(EODatabaseContext.java:4888)
        at 
com.webobjects.eoaccess.EODatabaseContext.relayAttributesInRelationshipSourceObjectDestinationObject(EODatabaseContext.java:4913)
        at 
com.webobjects.eoaccess.EODatabaseContext.relayAttributesInRelationshipSourceObjectDestinationObjects(EODatabaseContext.java:4966)
        at 
com.webobjects.eoaccess.EODatabaseContext.recordChangesInEditingContext(EODatabaseContext.java:6036)
        at 
com.webobjects.eocontrol.EOObjectStoreCoordinator.saveChangesInEditingContext(EOObjectStoreCoordinator.java:373)
        at 
com.webobjects.eocontrol.EOEditingContext.saveChanges(EOEditingContext.java:3192)
        at er.extensions.eof.ERXEC._saveChanges(ERXEC.java:1179)
        at er.extensions.eof.ERXEC.saveChanges(ERXEC.java:1102)
        at 
com.xeotech.mdspas.components.AdHocStorePayment.savePayment(AdHocStorePayment.java:255)

All of the objects are in the EC

EditingContext: ERXEC@12aa5705
        Registered [395]:       List omitted
        Inserted   [  8]:       [Invoice PK: 267], [InvoiceAudit PK: 66], 
[Payment PK: 241], [PaymentDetail PK: 237], 
                                [ProductItem PK: 91], [ProductItemPayment PK: 
77], [ShoppingCart PK: 55], 
                                [ShoppingCartProduct PK: 54]
        Updated    [  3]:       <Account pk:167>, <Practice pk:1>, <User pk:2>

and they are assigned as I would expect

Payment(6f44eaf7) :
        globalID                            = <Payment PK: 241> { pending } 
        editingContext                      = ERXEC@12aa5705            Added 
to EC, Updated in EC 

Attributes
        comments                            = NULL
        dateRecordCreated                   = Sunday July 19, 2015 @ 09:25 PM *
        dateRecordModified                  = Sunday July 19, 2015 @ 09:25 PM *
        isActive                            = true *
        paymentNumber                       = FPA20150719212521850 *
        totalAmount                         = 107.0
        transactionDate                     = Sunday July 19, 2015 @ 09:25 PM
        version                             = 1 *

To-One Relationships
        toAccount                           = <Account PK: 167>
        toAppointment                       = NULL
        toCashier                           = <User PK: 2> ( Patrick Abuzeni )  
*
        toRequestType                       = <RequestType PK: 1> ( One Time )  
*
        toTransactionType                   = NULL

To-Many Relationships

        toPaymentDetails                [ 1 ]
                1) eoObj = <PaymentDetail PK: 237> ( CAC201507190BFB )  { 
pending } 

        toProductItemPayments           [ 1 ]
                1) eoObj = <ProductItemPayment PK: 77> { pending } 

        toProductItems          [ 1 ]
                1) eoObj = <ProductItem PK: 91> { pending } 



ProductItem(d63d22) :
        globalID                            = <ProductItem PK: 91> { pending } 
        editingContext                      = ERXEC@12aa5705            Added 
to EC, Updated in EC 

Attributes
        dateRecordCreated                   = Sunday July 19, 2015 @ 09:24 PM *
        dateRecordModified                  = Sunday July 19, 2015 @ 09:24 PM *
        discountAmount                      = 0.0 *
        isActive                            = true *
        unitAmount                          = 100.0 *
        unitQuantity                        = 1 *
        version                             = 1 *

To-One Relationships
        toAuthorizedBy                      = NULL
        toInvoice                           = <Invoice PK: 267> { pending }
        toProduct                           = <Product PK: 3> ( Abdominoplasty 
Garment )  *

To-Many Relationships

        toPayments              [ 1 ]
                1) eoObj = <Payment PK: 241> { pending } 

        toProductItemPayments           [ 1 ]
                1) eoObj = <ProductItemPayment PK: 77> { pending } 

        toShoppingCartProducts          [ 1 ]
                1) eoObj = <ShoppingCartProduct PK: 54> { pending } 



ProductItemPayment(42d9e298) :
        globalID                            = <ProductItemPayment PK: 77> { 
pending } 
        editingContext                      = ERXEC@12aa5705            Added 
to EC, Updated in EC 

Attributes
        amountPledged                       = 107.0 *
        datePaid                            = Sunday July 19, 2015 @ 09:25 PM *
        dateRecordCreated                   = Sunday July 19, 2015 @ 09:25 PM *
        dateRecordModified                  = Sunday July 19, 2015 @ 09:25 PM *
        isActive                            = true *
        version                             = 1 *

To-One Relationships
        toPayment                           = <Payment PK: 241> { pending }
        toProductItem                       = <ProductItem PK: 91> { pending } *

To-Many Relationships

        toInvoiceAudits         [ 1 ]
                1) eoObj = <InvoiceAudit PK: 66> { pending } 

Diagram of the relevant parts of the model available upon request.


Any thoughts would be welcome.

Roger

 
> On Jul 16, 2015, at 4:41 PM, Roger Perryman <[email protected] 
> <mailto:[email protected]>> wrote:
> 
> Thanks Aaron and Chuck for your replies. I was fairly sure (afraid?) what the 
> answers would be. I was hoping their might be some WOnderful magical method 
> that could be used to “pull" the objects over since that is what it looked 
> like EOF did. I’ll check out ERXCopyable and see if that helps. I’m also 
> looking at restructuring the code to remove the need for the extra EC and 
> using a child EC as a backup plan.
> 
> A few years ago when I first noticed that localInstanceOfObject returned NULL 
> for new objects I thought it must be a bug. As I mentioned, my “fix” of just 
> returning the original object seemed to work and I never thought much more 
> about. It seemed to do “the right thing." I can only assume that it never 
> encountered a toMany relationship that was new (that is the only real 
> difference here) and the other EC was never saved so EOF didn’t notice that 
> danger lurked. I will need to take a closer look and make sure to correct any 
> code that needs it.
> 
> Roger
> 
> 
>> On Jul 16, 2015, at 2:20 PM, Chuck Hill <[email protected] 
>> <mailto:[email protected]>> wrote:
>> 
>> An EO lives in a specific EC and can’t be moved between then as a single 
>> Java object instances. The reason why localInstnace won’t work for new 
>> objects is that it does not move or copy the EO into the new EC.  It creates 
>> and brand new Java EO object and loads its values from the snapshot cache 
>> (or possibly from the database but let’s not over complicate this 
>> explanation).  An unsaved EO has no values in the snapshot cache (they get 
>> added when saved), so it is flat out not possible to localnstance a new 
>> object without some major changes to EOF. 
>> 
>> What might work for you is a child EC.  You can then revert what changes you 
>> don’t want and save into the parent EC for final saving.
>> 
>> ERXCopyable might also be a solution.
>> 
>> Chuck
>> 
>> From: <[email protected] 
>> <mailto:[email protected]>> on 
>> behalf of Aaron Rosenzweig <[email protected] <mailto:[email protected]>>
>> Date: Thursday, July 16, 2015 at 10:56 AM
>> To: Roger Perryman <[email protected] <mailto:[email protected]>>
>> Cc: WebObjects Dev List <[email protected] 
>> <mailto:[email protected]>>
>> Subject: Re: localInstanceOfObject
>> 
>> Hi Roger,
>> 
>> I skimmed your post.
>> 
>> You cannot local instance an unsaved object. You just cannot do it. Don’t 
>> try anything clever… the EO is tied to a unit of work (editing context) and 
>> without ever being saved it simply is not possible to local instance it.
>> 
>> You may have to use the “memento” pattern for your particular case. Make a 
>> simple java object, nothing about DB persistence… and then make it an EO 
>> only after it has passed muster.
>> AARON ROSENZWEIG / Chat 'n Bike <http://www.chatnbike.com/>
>> e:  [email protected] <mailto:[email protected]>  t:  (301) 956-2319 
>>      
>> On Jul 16, 2015, at 1:04 PM, Roger Perryman <[email protected] 
>> <mailto:[email protected]>> wrote:
>> 
>>> Hi All!
>>> 
>>> I am having an issue with local instancing an EO and I would like some help 
>>> understanding the problem. I found an old thread started by Kieran Kelleher 
>>> where he was having similar issues. Mike Schrag had mentioned that EOF 
>>> couldn't tell if a new object localInstanced from another EC had later been 
>>> saved in the other EC which could result in collisions so it erred on the 
>>> side of caution. So I am probably using the method inappropriately. 
>>> Hopefully someone will point out the problem and offer the correct way.
>>> 
>>> I've noticed that when I localInstance a new EO (not yet saved to the 
>>> database) both the WebObjects and WOnder versions return null for the EO. 
>>> It seems odd for the method to return null if it is a new method. I wrote a 
>>> customized version that detects if it is a new EO and just returns the 
>>> original EO. I've been using it for quite some time now and it at least 
>>> _seemed_ to work better. My use cases must have avoided conflicts.
>>> 
>>> However, I've recently noticed problems. They may have been there before. I 
>>> did recently update my computer (OSX 10.10.3) and dev environment to the 
>>> latest WOnder (6.1.4-SNAPSHOT), Java 8 (1.8.0_45), Eclipse (4.4.2) with 
>>> matching WOLips. 
>>> 
>>> I'm creating a new EC because many of the objects in the original EC are 
>>> disposable and are not intended to be written to the DB, even if they 
>>> happen to change. The problem is because of passing the original EO to the 
>>> new EC instead of NULL that would normally be returned but the 
>>> relationships cannot be NULL. I wrote a clone method for some of the 
>>> objects for testing but it got very complex very fast because of deeper 
>>> objects in the relationship. As you can see from my debugging output, all 
>>> required fields (*'s) are set and relationships are set. 
>>> 
>>> This group is the objects in the old (original) EC and the original Invoice 
>>> that has not been saved yet but it has had an oid assigned. It also has a 
>>> to-many relationship to new ProductItem objects. 
>>> 
>>> OLD EC
>>> EditingContext:ERXEC@2d334040
>>> Registered [375]:List omitted
>>> Inserted   [  5]:[Invoice PK: 250], [ProductItem PK: 74], 
>>> [ProductItemPayment PK: 61], 
>>> [ShoppingCart PK: 44], [ShoppingCartProduct PK: 44]
>>> Updated    [  3]:<Account pk:167>, <Practice pk:1>, <User pk:2>
>>> Deleted    [  0]:EMPTY
>>> 
>>> OLD Invoice: 
>>> Invoice(5bdf1c53) :
>>> globalID                            = <Invoice PK: 250> { pending } 
>>> editingContext                      = ERXEC@2d334040 Added to EC 
>>> 
>>> Attributes
>>> approvedDeposit                     = NULL
>>> dateRecordCreated                   = Wednesday July 15, 2015 @ 03:19 PM *
>>> dateRecordModified                  = Wednesday July 15, 2015 @ 03:19 PM *
>>> invoiceDate                         = Wednesday July 15, 2015 @ 03:19 PM *
>>> invoiceDiscount                     = NULL
>>> invoiceNumber                       = IJD20150715151938381 *
>>> isActive                            = true *
>>> taxRate                             = 0.07 *
>>> totalFees                           = 0.0 *
>>> totalNonTaxable                     = 0.0 *
>>> totalTaxable                        = 0.0 *
>>> version                             = 1 *
>>> 
>>> To-One Relationships
>>> toAccount                           = <Account PK: 167> *
>>> toCheckListPostOp                   = NULL
>>> toCheckListPreOp                    = NULL
>>> toCheckListSurgery                  = NULL
>>> toCoordinator                       = <User PK: 2> ( Jane Doe )  *
>>> toInvoiceStatus                     = <InvoiceStatus PK: 1> ( Open )  *
>>> toInvoiceType                       = <InvoiceType PK: 2> ( Invoice )  *
>>> toPractice                          = <Practice PK: 1> ( DEFAULT_PRACTICE ) 
>>>  *
>>> toSurgeryRequest                    = NULL
>>> 
>>> To-Many Relationships
>>> 
>>> toProductItems[ 1 ]
>>> 1) eoObj = <ProductItem PK: 74> { pending } 
>>> 
>>> toRequestDetails
>>> No Records
>>> 
>>> toServiceItems
>>> No Records
>>> 
>>> 
>>> This group is the objects in the new EC and the cloned Invoice that has not 
>>> been saved yet but it has had an oid assigned. It also has a to-many 
>>> relationship to new ProductItem objects. Note the oid has increased and 
>>> unique attributes have been adjusted. When I try to save, it fails because 
>>> the objects associated with ProductItems have a relationship in a different 
>>> EC (and retain their original oids).
>>> 
>>> NEW Invoice: 
>>> Invoice(6371d408) :
>>> globalID                            = <Invoice PK: 251> { pending } 
>>> editingContext                      = ERXEC@1c741963 Added to EC, Updated 
>>> in EC 
>>> 
>>> Attributes
>>> approvedDeposit                     = NULL
>>> dateRecordCreated                   = Wednesday July 15, 2015 @ 03:30 PM *
>>> dateRecordModified                  = Wednesday July 15, 2015 @ 03:30 PM *
>>> invoiceDate                         = Wednesday July 15, 2015 @ 03:19 PM *
>>> invoiceDiscount                     = NULL
>>> invoiceNumber                       = IJD20150715151938952 *
>>> isActive                            = true *
>>> taxRate                             = 0.07 *
>>> totalFees                           = 0.0 *
>>> totalNonTaxable                     = 0.0 *
>>> totalTaxable                        = 0.0 *
>>> version                             = 1 *
>>> 
>>> To-One Relationships
>>> toAccount                           = <Account PK: 167> *
>>> toCheckListPostOp                   = NULL
>>> toCheckListPreOp                    = NULL
>>> toCheckListSurgery                  = NULL
>>> toCoordinator                       = <User PK: 2> ( Jane Doe )  *
>>> toInvoiceStatus                     = <InvoiceStatus PK: 1> ( Open )  *
>>> toInvoiceType                       = <InvoiceType PK: 2> ( Invoice )  *
>>> toPractice                          = <Practice PK: 1> ( DEFAULT_PRACTICE ) 
>>>  *
>>> toSurgeryRequest                    = NULL
>>> 
>>> To-Many Relationships
>>> 
>>> toProductItems[ 1 ]
>>> 1) eoObj = <ProductItem PK: 74> { pending } 
>>> 
>>> toRequestDetails
>>> No Records
>>> 
>>> toServiceItems
>>> No Records
>>> 
>>> NEW ProductItems: 
>>> (
>>> ProductItem(1695d9bc) :
>>> globalID                            = <ProductItem PK: 74> { pending } 
>>> editingContext                      = ERXEC@2d334040 Added to EC, Updated 
>>> in EC 
>>> 
>>> Attributes
>>> dateRecordCreated                   = Wednesday July 15, 2015 @ 03:15 PM *
>>> dateRecordModified                  = Wednesday July 15, 2015 @ 03:15 PM *
>>> discountAmount                      = 0.0 *
>>> isActive                            = true *
>>> unitAmount                          = 100.0 *
>>> unitQuantity                        = 1 *
>>> version                             = 1 *
>>> 
>>> To-One Relationships
>>> toAuthorizedBy                      = NULL
>>> toInvoice                           = <Invoice PK: 250> { pending }
>>> toProduct                           = <Product PK: 3> ( Abdominoplasty 
>>> Garment )  *
>>> 
>>> To-Many Relationships
>>> 
>>> toGiftCards
>>> No Records
>>> 
>>> toPayments
>>> No Records
>>> 
>>> toProductItemPayments[ 1 ]
>>> 1) eoObj = <ProductItemPayment PK: 61> { pending } 
>>> 
>>> toShoppingCartProducts[ 1 ]
>>> 1) eoObj = <ShoppingCartProduct PK: 44> { pending } 
>>> )
>>> 
>>> NEW EC
>>> EditingContext:ERXEC@1c741963
>>> Registered [179]:List omitted
>>> Inserted   [  1]:[Invoice PK: 251]
>>> Updated    [  3]:<Account pk:167>, <Practice pk:1>, <User pk:2>
>>> Deleted    [  0]:EMPTY
>>> 
>>> 
>>> Is there a correct way to "localInstance" an unsaved EO? Or do I need to 
>>> restructure the code and perhaps use nested ECs?
>>> 
>>> Thanks,
>>> 
>>> Roger
>>> 
>>> _______________________________________________
>>> Do not post admin requests to the list. They will be ignored.
>>> Webobjects-dev mailing list      ([email protected] 
>>> <mailto:[email protected]>)
>>> Help/Unsubscribe/Update your Subscription:
>>> https://lists.apple.com/mailman/options/webobjects-dev/aaron%40chatnbike.com
>>>  
>>> <https://lists.apple.com/mailman/options/webobjects-dev/aaron%40chatnbike.com>
>>> 
>>> This email sent to [email protected] <mailto:[email protected]>
> 
> _______________________________________________
> Do not post admin requests to the list. They will be ignored.
> Webobjects-dev mailing list      ([email protected] 
> <mailto:[email protected]>)
> Help/Unsubscribe/Update your Subscription:
> https://lists.apple.com/mailman/options/webobjects-dev/roger%40xeotech.com 
> <https://lists.apple.com/mailman/options/webobjects-dev/roger%40xeotech.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]

Reply via email to