Howdy -- this is a good question Colin, and it's confusing because we don't really explain what "as a direct result" means.
When we say "as a direct result", that means the method is invoked because the client called a corresponding method in an interface. Even ejbActivate() can be called whenever the Container wants to... although you're right, most of the time it is called because the client invoked a business method that starts a new transaction. But the Container can do whatever it wants with activation and passivation behind the scenes. Unlike stateful session beans, an entity bean can be passivated even while it's in a transaction. So, even in the course of one transaction triggered by one initial call from the client, there could be activation/passivation going on (the bean always gets the ejbStore() before passivation, though... that much IS guaranteed.)
So, we want you to separate out the ones that are *always* triggered as a DIRECT result of a client call from the ones that *might* be triggered as the direct result of a client call. It's the
word "direct" that matters, but I agree that this is confusing because we didn't define what we really mean by "direct", and ejbActivate() is a fuzzy area, but just remember that what the Container does behind the scenes is anything the Container wants to do... as long as the behavior is synchronized with the database properly.
When you see "direct" think, ALWAYS invoked as opposed to MIGHT be invoked. If client calls a business method, or any other method on a bean, there is never a guarantee that the other intermediate methods are called (including ejbActivate and ejbLoad).
But I think your point was that even if it isn't called EVERY time, the times when it IS called are always a result of a client invocation, right? That's how it looks, yes. But in the spec (page 169) it gives the Container flexibility to do whatever it wants there. I should have pointed this out more specifically... your conclusion is completely reasonable!
So when you see "as a direct result" think only of the things which are ALWAYS invoked (unless the Container refuses for security reasons or errors) and
you should be safe. If something might or might not be invoked as part of the underlying process of getting the bean ready, then don't include it as a direct result.
Hope that helps,
Kathy