Many people are surprised when lazy loading of inverse (not owning) optional one-to-one relationships using Hibernate does not work for them out of the box. Let's start with a short example: @Entity public class Person { private Animal animal; @OneToOne(optional = false) public Animal getAnimal() { return animal; } public void setAnimals(Animal animal) { this.animal = animal; } } @Entity public cl