OK, I think I've figured out at least partially what's causing this to happen. In my war file I had included the hibernate jar (along with its dependencies). This appears to cause the Tomcat classloader to load a separate instance of SessionFactoryObjectFactory, the helper class for JNDI -> object references. When the second instance was loaded, it has an empty mapping hash, so none of the lookups returned the objects. I was able to get my war file to load fine by removing the hibernate libs.