After some frustrating issues and tests, I've read that hibernate can't lazily fetch ToOne relationships.
From what I've read, hibernate lazily fetches ToMany by setting its own Set as a proxy, and when a method is called on that Set, it fetched the data in the database before performing the action. Fine.
For ToOne, the reason I've seen is that since the attribute can be null (unlike ToMany), hibernate has to know whether it needs to populate it with null or a proxy, and that hibernate cannot know that without querying the other table. And since it has to query that other table, it eagerly fetches the data at the same time.
I find that rather stupid. I can understand it on the non owning side of the relationship, where nothing in the table indicates whether the toOne is populated, but on the owning side, the table contains a column with the foreign key, which is either null or not.
Why can't hibernate query the table and set the attribute to either null or a proxy depending on the value from that column? It doesn't need to check the second table, if your column is not null, you know the second table has a corresponding entry (and if it hasn't, you have an integrity problem and hibernate should just throw).