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 <lists.fab...@e-lumo.com> 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      (Webobjects-dev@lists.apple.com)
> Help/Unsubscribe/Update your Subscription:
> https://lists.apple.com/mailman/options/webobjects-dev/samuel%40samkar.com
> 
> This email sent to sam...@samkar.com

 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      (Webobjects-dev@lists.apple.com)
Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to