JDBC: lazy loading y objetos dependientes

Hola soy usuario nuevo y niubi.

Ayer empece a leer sobre jdbc y me vinieron dudas sobre la carga de objetos desde una base de datos y las referencias que guardan estos, no conozco bien los terminos asi que disculpen

Si en la base de datos tenemos registros que poseen referencias a otros registros como puede ser Cliente y Direccion y yo quisiera recuperar un listado de Cliente, podria tomar diferentes enfoques para cargar los objetos dependientes

1.- Al utilizar join y cargarlos todos de una vez (pero si solo quiero usar uno de los objetos )
2.- Cargar los objetos dependientes a medida que los vaya usando ( consultas por cada propiedad ? )
...
n ?

class Cliente{
   String nombre;
   Direccion[] direcciones;

   String getNombre(){
       return nombre;
   }

   Direcciones[] getDirecciones(){
      return direcciones;  ????
   }
}

class Direccion{
   String calle;
   int numero;

   String getCalle(){
      return calle;
   }

   int getNumero(){
      return numero;
   }
}

Cual es la forma apropiada de abordar este problema(al menos los es para mi :/ ) ?
Podrían dar ejemplos ?
Libros que oborden el tema ?

Habia leido que con hibernate solucionaban esto, pero deberian haber ejemplos sin frameworks por ahi (para poder entender)

De antemano muchas gracias