its called in all SQL loading scenarios including that of relationships.
A relationship load might not actually result in the object being loaded from the DB in these scenarios:
1. the relationship is a simple many-to-one, and the object could be located by primary key from the identity map without emitting a SQL load.
2. the relationship emitted the SQL, but as it loaded the rows, the objects matching those rows were already in the identity map, so they weren't reconstructed.
In both scenarios above, the objects were still guaranteed to be present in the identity map in only three possible ways:
1. they were loaded at some point earlier, in which case your reconstructor was called
2. they moved from "pending" to "persistent" , meaning you added them with add(), then they got inserted, so you'd want to make sure
whatever regular __init__ does is appropriate here
3. the objects were detached, and were add()ed back into the session, but this still implies that #1 or #2 were true for a previous Session.