Interesting - I did try your workaround and didn't see a difference, but probably I did something incorrectly. I'll play with it some more.
For the superclass we were using @MappedSuperclass with single table inheritance strategy. I traced through the select process in debug mode and saw that it skipped over a number of the fields. In JDBCStoreManager.selectSubclassMappings() there's a comment: // select all subclass mappings that match the fetch configuration // and whose table is in the list of those selected so far; this // way we select the max possible without selecting any tables that // aren't present in all possible query matches; a special case // is made for mappings that use 2-part selects that aren't // explicitly *not* in the default so that they can get their // primary table data I interpret this to mean that since we don't know the type of the subclass in advance, we don't know if we'll need to join a particular table or not, so only select from the ones we're already joined with. ________________________________________ From: Henno Vermeulen <he...@huizemolenaar.nl> Sent: Tuesday, July 22, 2014 12:03 AM To: users@openjpa.apache.org Subject: RE: Avoiding N+1 on collection in recursive relation First issue: We don't use the data cache either! If I recall correctly, exactly for the same reason: for different use cases we may use different fetch plans for the same entity. (Actually at our client-side we have actually implement our home-made cache - backed by ehache - that uses the fetchplan name as part of the cache key.). I was speaking about the entities in the persistence context. This is a non-shared first-level cache of the EntityManager that is only kept for the duration of one transaction. As far as I know this is always used by default and cannot be turned off. I believe it is also used internally by JPA. When multiple database queries are done in one transaction, JPA can use this temporary cache to find referenced entities that have already been loaded during the same transaction, even if you don't have shared second-level cache turned on. So if your performance issue is important I suggest giving my suggestion a try! Second issue: I haven't seen that before. Perhaps this depends on the inheritance strategy. We have had no problems with InheritanceType.TABLE_PER_CLASS but we have had issues with an incorrect query being generated when using InheritanceType.JOINED so we don't use that. Depending on your use case you may also use @MappedSuperclass which has been working fine for us. Regards, Henno -- _____________ David Minor