Solucionado (ver solución)
Solucionado
(ver solución)
2
respuestas

[Duda] ¿Porqué findById() y no getReferenceById() en este punto?

En la clase Nº 8 - Clase Service, al momento de querer guardar la consulta en el repositorio con los siguientes parámetros:


public void addNewConsult(ConsultDataReg dataReg) {
    Patient patient = patientRepo.findById(dataReg.patientId()).get();
    Medic medic = medicRepo.findById(dataReg.medicId()).get();

    Consult consult = new Consult(null, patient, medic, dataReg.dateTime());

    consultRepo.save(consult);
}

Me surgió la duda, de porqué utiliza:

Patient patient = patientRepo.findById(dataReg.patientId()).get();

Y no utiliza:

Patient patient = patientRepo.getReferenceById(dataReg.patientId());

En sí no entiendo cuál sería la diferencia directa entre ambos, ya que primero busca por el id y si lo encuentra usa get() que al final retornará la entidad que encontró, considero que getReferenceById() podría hacer lo mismo, ¿o me equivoco?.

2 respuestas
solución!

Hola Jorge,

Tu pregunta es muy relevante, lo cual es genial. La diferencia entre findById().get() y getReferenceById() radica principalmente en cómo Hibernate maneja estos métodos.

findById().get() ejecutará inmediatamente una consulta SQL SELECT en la base de datos para recuperar el registro completo. Esto significa que tendrás todos los datos disponibles de inmediato.

Por otro lado, getReferenceById() utiliza lo que se llama "carga perezosa" o "lazy loading". Cuando se llama a este método, Hibernate no ejecuta inmediatamente una consulta SELECT. En su lugar, devuelve un proxy (un objeto falso) que contiene solo el ID del registro. La consulta SQL real se retrasa hasta que realmente necesites acceder a los otros campos del registro.

Entonces, si solo necesitas el ID del registro y no vas a utilizar ninguno de los otros campos, getReferenceById() puede ser más eficiente porque evita una consulta SQL innecesaria. Pero si vas a necesitar los otros campos del registro, entonces findById().get() es la opción correcta, ya que de todos modos tendrás que ejecutar la consulta SQL.

Necesitas los datos completos del paciente y del médico para crear la consulta, por lo que findById().get() es la elección correcta. Espero que esta explicación te ayude con la diferencia entre estos dos métodos. Mucho éxito en todo lo que te propongas y si tienes alguna duda aquí estaremos para apoyarte.

¡Vamos juntos!

Si este post te ayudó, por favor, marca como solucionado ✓. Continúa con tus estudios

Muchas gracias Adriana, realmente me sirvió para entender la diferencia entre ambos métodos, ahora ya sé porqué el instructor usó findById().get() en esta ocasión.