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: Samuel Pelletier <email@hidden>
- Date: Tue, 12 Feb 2019 08:50:54 -0500
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