Re: EOModel of sub-entity not added to EODatabase
Re: EOModel of sub-entity not added to EODatabase
- Subject: Re: EOModel of sub-entity not added to EODatabase
- From: Fabian Peters <email@hidden>
- Date: Tue, 12 Feb 2019 18:59:09 +0100
Salut Samuel!
Good catch, that looks like it might work! Merci bien!
Fabian
> Am 12.02.2019 um 14:50 schrieb Samuel Pelletier <email@hidden>:
>
> Hi Fabian,
>
> I'm not familiar with this low level part of EOF but after surfing the doc I
> may have something.
>
> Have you try to register the CooperatingObjectStoreWasAddedNotification ? If
> the new object store is passed, you may have an opportunity to force load the
> model there.
>
> Regards,
>
> Samuel
>
>
>> Le 12 févr. 2019 à 07:16, Fabian Peters <email@hidden> a écrit :
>>
>> Hello everybody!
>>
>> I've come across an issue with cross-model inheritance (single-table in this
>> case). For a minimal test setup I added an EOModel FrameworkUser to
>> ERMoviesLogic, containing an abstract parent entity AbstractUser and a
>> concrete child entity FrameworkUser. I added a second EOModel AppUser with a
>> concrete child of AbstractUser called AppUser to the ERModernMoviesTest app.
>>
>> Fetching for all AbstractUser EOs does return all concrete child EOs, i.e.
>> both FrameworkUser and AppUser. Accessing attributes that are available on
>> AbstractUser is fine, but deleting an AppUser EO causes an exception:
>>
>> java.lang.IllegalStateException: Unable to find entity for object
>>
>> It turns out that the EOModel AppUser is not being added to the EODatabase
>> when the fetch is carried out.
>>
>> Deletion with concrete child entity in FrameworkUser:
>>
>> ERXDatabase.addModel: FrameworkUser
>> Feb 12 12:09:07 ERModernMoviesTest[9876] DEBUG NSLog - Using JDBCPlugIn
>> 'H2PlugIn' for ERCompositeAdaptor@1026056307
>> Feb 12 12:09:07 ERModernMoviesTest[9876] DEBUG NSLog - connecting with
>> dictionary: {driver = "org.h2.Driver"; plugin = "H2PlugIn"; password =
>> "<password deleted for log>"; URL = "jdbc:h2:mem:ERModernMoviesTest"; }
>> Feb 12 12:09:07 ERModernMoviesTest[9876] DEBUG NSLog - === Begin Internal
>> Transaction
>> Feb 12 12:09:07 ERModernMoviesTest[9876] DEBUG NSLog - evaluateExpression:
>> <com.webobjects.jdbcadaptor._H2PlugIn$H2Expression: "SELECT t0.ACCESS_LEVEL,
>> t0.CUSTOMER_ID, RTRIM(t0.PASSWORD), RTRIM(t0.TYPE), t0.USER_ID,
>> RTRIM(t0.LOGIN) FROM rentalsuser t0 WHERE (t0.TYPE = ? OR t0.TYPE = ?)"
>> withBindings: 1:"app"(type), 2:"framework"(type)>
>> Feb 12 12:09:07 ERModernMoviesTest[9876] DEBUG NSLog - 4 row(s) processed
>> Feb 12 12:09:07 ERModernMoviesTest[9876] DEBUG NSLog - === Commit Internal
>> Transaction
>> FetchTask._call: ringle: app
>> FetchTask._call: jboyles: app
>> FetchTask._call: lstark: app
>> FetchTask._call: jjeffers: framework
>>
>> => java.lang.IllegalStateException: Unable to find entity for object
>> <webobjectsexamples.businesslogic.common.AppUser pk:"4">
>>
>> Deletion with only abstract parent entity AbstractUser in FrameworkUser:
>>
>> ERXDatabase.addModel: FrameworkUser
>> Feb 12 12:11:36 ERModernMoviesTest[9876] DEBUG NSLog - Using JDBCPlugIn
>> 'H2PlugIn' for ERCompositeAdaptor@22939787
>> Feb 12 12:11:36 ERModernMoviesTest[9876] DEBUG NSLog - connecting with
>> dictionary: {driver = "org.h2.Driver"; plugin = "H2PlugIn"; password =
>> "<password deleted for log>"; URL = "jdbc:h2:mem:ERModernMoviesTest"; }
>> Feb 12 12:11:36 ERModernMoviesTest[9876] DEBUG NSLog - === Begin Internal
>> Transaction
>> Feb 12 12:11:36 ERModernMoviesTest[9876] DEBUG NSLog - evaluateExpression:
>> <com.webobjects.jdbcadaptor._H2PlugIn$H2Expression: "SELECT t0.ACCESS_LEVEL,
>> t0.CUSTOMER_ID, RTRIM(t0.PASSWORD), RTRIM(t0.TYPE), t0.USER_ID,
>> RTRIM(t0.LOGIN) FROM rentalsuser t0 WHERE t0.TYPE = ?" withBindings:
>> 1:"app"(type)>
>> Feb 12 12:11:36 ERModernMoviesTest[9876] DEBUG NSLog - 3 row(s) processed
>> Feb 12 12:11:36 ERModernMoviesTest[9876] DEBUG NSLog - === Commit Internal
>> Transaction
>> FetchTask._call: ringle: app
>> FetchTask._call: jboyles: app
>> FetchTask._call: lstark: app
>>
>> => java.lang.IllegalStateException: Unable to find entity for object
>> <webobjectsexamples.businesslogic.common.AppUser pk:"4">
>>
>> Interestingly, the restricting qualifier is being correctly generated, i.e.
>> it contains the type for "app" and for "framework" EOs.
>>
>> As a workaround, I add the following before the fetch
>>
>>
>> EODatabaseContext.registeredDatabaseContextForModel(ERXModelGroup.defaultGroup().modelNamed("AppUser"),
>> ec);
>>
>> which forces the model to be loaded.
>>
>> Now, my question is where can this be fixed in a generic manner? The fetch
>> causes an EOCooperatingObjectStoreNeededNotification notification to be
>> sent, which gets handled by
>> EODatabaseContext._cooperatingObjectStoreNeeded(). But that's a static
>> method…
>>
>> Fabian
>>
>> P.S.: The fetch in question takes place in an EC created with an
>> EOObjectStoreCoordinator from the ERXTaskObjectStoreCoordinatorPool. AFAICT
>> this is only relevant in that the EOModel is more likely to not having been
>> added, compared to using an EOObjectStoreCoordinator that is shared among
>> sessions.
>> _______________________________________________
>> 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
>
_______________________________________________
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