Thanks Samuel. The interesting thing is that I do not have a relationship 
ProductItemPayment.toProductItems (with an s) in my model. I tried to reduce 
the image that the moderators blocked but it became unreadable so here is the 
textual form. ProductItemPayments is a custom class with additional attributes 
and relationships and a single primary key (I try to avoid compound keys except 
for EOGenericRecord entities).

§  PK                »  To-Many  
ƒ  FK                ›  To-One
ø  Allows Null       ø  Allows Null
◊  Class Property    ¬  Locking Attribute
≈  Flattened Relationship 

ProductItem
-----------
§   ¬   oid
  ◊ ¬   version
        ---------
  ◊     unitAmount
  ◊     unitQuantity
ƒ     ø oidInvoice
ƒ       oidProduct
        -----------
› ◊     toProduct              oidProduct -> Product.oid
› ◊   ø toInvoice              oidInvoice -> Invoice.oid
» ◊   ø toProductItemPayments  oid <- ProductItemPayment.oidProductItem
» ◊ ≈ ø toPayments             toProductItemPayments.toPayment


ProductItemPayment
------------------
§   ¬   oid
  ◊ ¬   version
        ---------
  ◊     amountPledged
ƒ     ø oidPayment
ƒ       oidProductItem
        -----------
› ◊   ø toProductItem          oidProductItem -> ProductItem.oid
› ◊   ø toPayment              oidPayment -> Payment.oid
» ◊   ø toInvoiceAudits        oid <- InvoiceAudit.oidProductItem


Payment
-------
§   ¬   oid
  ◊ ¬   version
        ---------
  ◊     unitAmount 
        -----------
» ◊ ≈ ø toProductItems         toProductItemPayments.toProductItem
» ◊   ø toProductItemPayments  oid <- ProductItemPayment.oidProductItem


> On Jul 20, 2015, at 8:49 PM, Samuel Pelletier <[email protected]> wrote:
> 
> Hi Roger,
> 
> There is something strange, I may misunderstand the error but it seems the 
> toProductItems relationship of ProductItemPayment specify a join on the 
> oidProductItem and oidPayment columns but all your entities seems to have 
> single column primary keys,
> 
> I suggest to check your relationship definitions to make sure they use the 
> corrects columns, starting with the toProductItems in ProductItemPayment.
> 
> Samuel 
> 
>> Le 2015-07-20 à 15:39, Roger Perryman <[email protected] 
>> <mailto:[email protected]>> a écrit :
>> 
>> 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] <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/samuel%40samkar.com 
>> <https://lists.apple.com/mailman/options/webobjects-dev/samuel%40samkar.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])
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