ClassCastException being thrown, this was due to the fact that a lazily loaded List of objects retrieved by hibernate contained proxied objects. The entities that were proxied were using a single table inheritance strategy, so there is a base class that is subclassed several times. The entities once loaded were being sorted into separate lists that are typed according to the subclasses, they were being cast into the appropriate subclass but this cast was failing because instead of being an instance of say Animal it was an instance of Animal$$EnhancerByCGLIB$$10db1483 i.e. A Hibernate Proxy. Let me show you an example.Animal class, lets say, Cat and Dog...animal_type_id, which I have defined 2 to be Dog and 1 to be Cat. So now we should make sure we have some data in a database table called animals...assertEquals at the end of the test pass, even though the code looks like it should be adding items to these lists based on what is in the Adatabase. This is because animal is not an instanceof Cat or Dog but an instanceof Animal$$EnhancerByCGLIB$$10db1483.Hibernate.initialize(animal); which will force the animal class to become the actual object, not the proxy. I felt this approach to be dirty and it is really polluting code that shouldn't really know anything about hibernate.Animal class to implement...Animal class I showed earlier implement the AnimalEntity...instanceof or having to cast anything (which is what was happening in the live code I talked about) which can cause weird side effects and AnimalEntityVisitor, so when animal.accept(this); is called, it calls the appropriate visit method on "this". In our case the visit method is just adding the object to a list. So I've updated the assertEquals calls to be what I now expect and the test passes.Labels: ClassCastException, EnhancerByCGLIB, hibernate, java, patterns, spring