Preguntas de la entrevista de Hibernate - Conceptos de codificación N

Lista de preguntas frecuentes durante las entrevistas de hibernación. Siga esta publicación para obtener actualizaciones periódicas.

Índice
  1. ¿Cuáles son las clases e interfaces clave en Hibernate?
  2. ¿Diferencia entre caché de primer y segundo nivel?
  3. ¿Diferencia entre los métodos save() y saveOrUpdate() en la sesión de hibernación?
  4. ¿Diferencia entre get() y load() en la sesión de hibernación?
  5. ¿Cuál es el problema N+1 en Hibernate y cómo solucionarlo?

¿Cuáles son las clases e interfaces clave en Hibernate?

  1. Configuración

    Configuration configuration = new Configuration();
    
    // Hibernate settings equivalent to hibernate.cfg.xml's properties
    Properties settings = new Properties();
    settings.put(Environment.DRIVER, "com.mysql.cj.jdbc.Driver");
    settings.put(Environment.URL, "jdbc:mysql://localhost:3306/hibernate_db?useSSL=false");
    settings.put(Environment.USER, "root");
    settings.put(Environment.PASS, "root");
    settings.put(Environment.DIALECT, "org.hibernate.dialect.MySQL5Dialect");
    settings.put(Environment.SHOW_SQL, "true");
    settings.put(Environment.HBM2DDL_AUTO, "create-drop");
    
    configuration.setProperties(settings);
    
  2. registro de servicio

    ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
        .applySettings(configuration.getProperties()).build();
    
  3. SessionFactory proporciona una instancia de Session. Es una clase de fábrica que proporciona objetos de sesión en función de los parámetros de configuración para establecer la conexión con la base de datos. Como práctica recomendada, la aplicación suele tener una sola instancia de SessionFactory. El estado interno de una SessionFactory que incluye metadatos en ORM es inmutable, es decir, una vez que se crea la instancia, no se puede cambiar.

    SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
    
  4. La sesión es un objeto que mantiene la conexión entre la aplicación del objeto Java y la base de datos. La sesión también tiene métodos para almacenar, recuperar, modificar o eliminar datos de la base de datos mediante métodos como persist(), load(), get(), update(), delete(), etc. Además, tiene métodos de fábrica para devolver objetos de Consulta, Criterio y Transacción.

    Session session = sessionFactory.openSession();
    
  5. Consulta

    String hql = "FROM Employee";
    Query query = session.createQuery(hql);
    List results = query.list();
    
  6. Criterios

    Criteria criteria = session.createCriteria(Employee.class);
    // To get records having salary more than 2000
    criteria.add(Restrictions.gt("salary", 2000));
    List results = criteria.list();
    
  7. Transacción

    Session session = sessionFactory.openSession();
    Transaction transaction;
    try {
        transaction = session.beginTransaction();
        //do some work
        ...
        transaction.commit();
    }
    catch (Exception e) {
        if (transaction!=null) transaction.rollback();
        throw e;
    }
    finally {
        session.close();
    }
    

¿Diferencia entre caché de primer y segundo nivel?

Hibernate tiene 2 tipos de caché. Caché de primer y segundo nivel cuya diferencia se da a continuación:

Caché de primer nivel Caché de segundo nivel
Esto es local para el objeto de sesión y no se puede compartir entre varias sesiones. Este caché se mantiene en el nivel de SessionFactory y se comparte entre todas las sesiones de Hibernate.
Este caché está habilitado de forma predeterminada y no hay forma de deshabilitarlo. Esto está deshabilitado por defecto, pero podemos habilitarlo a través de la configuración.
El caché de primer nivel solo está disponible hasta que se abre la sesión, una vez que se cierra la sesión, el caché de primer nivel se destruye. El caché de segundo nivel está disponible durante todo el ciclo de vida de la aplicación, solo se destruye y se vuelve a crear cuando se reinicia una aplicación.

Si una entidad u objeto se carga llamando al get() por lo tanto, Hibernate verificó primero el caché de primer nivel, si no encuentra el objeto, cambia al caché de segundo nivel si está configurado. Si no se encuentra el objeto, finalmente va a la base de datos y devuelve el objeto, si no hay una fila coincidente en la tabla, devuelve nulo.

¿Diferencia entre los métodos save() y saveOrUpdate() en la sesión de hibernación?

Ambos métodos guardan los registros en la tabla de la base de datos en caso de que no haya registros con la clave principal en la tabla. Sin embargo, las principales diferencias entre estos dos se enumeran a continuación:

registrarse () guardar o actualizar ()
Session.save() genera una nueva identificación e INSERTAR registro en una base de datos Session.saveOrUpdate() puede INSERTAR o ACTUALIZAR dependiendo de la existencia de un registro.
La inserción falla si la clave principal ya existe en la tabla. Si la clave principal ya existe, el registro se actualiza.
El tipo de retorno es Serializable, que es el valor de identificador recién generado como un objeto Serializable. El tipo de retorno del método saveOrUpdate() es nulo.
Este método se usa solo para llevar un objeto transitorio a un estado persistente. Este método puede llevar objetos transitorios (nuevos) y separados (existentes) a un estado persistente. A menudo se usa para volver a adjuntar un objeto separado a una sesión.

Claramente, saveOrUpdate() es más flexible en términos de uso, pero implica un procesamiento adicional para saber si ya existe un registro en la tabla o no.

¿Diferencia entre get() y load() en la sesión de hibernación?

Estos son los métodos para obtener datos de la base de datos. Las principales diferencias entre obtener y cargar en Hibernate se dan a continuación:

obtener() Cargar()
Este método recupera datos de la base de datos tan pronto como se llama. Este método devuelve un objeto proxy y carga datos solo cuando es necesario.
Se accede a la base de datos cada vez que se llama al método. La base de datos se toca solo cuando es realmente necesario y esto se llama Lazy Loading que mejora el método.
El método devuelve nulo si no se encuentra el objeto. El método lanza ObjectNotFoundException si no se encuentra el objeto.
Este método debe usarse si no estamos seguros de la existencia de datos en la base de datos. Este método se utilizará cuando se sepa con certeza que los datos están presentes en la base de datos.

¿Cuál es el problema N+1 en Hibernate y cómo solucionarlo?

Se dice que el problema de consulta N+1 ocurre cuando un ORM, como Hibernate, ejecuta 1 consulta para obtener la entidad principal y N consultas para obtener las entidades secundarias. Esto sucede debido a la carga diferida y la estrategia de recuperación bajo demanda de Hibernate.

Considere un ejemplo en el que un usuario puede tener varias direcciones.

@Entity
@Table(name = "user")
public class User {

	@Id
	private String id;

	@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "user")
	private List<Address> addresses;
}

@Entity
@Table(name = "address")
public class Address {
	@Id
	private String id;

	@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
	@JoinColumn(name = "user_id", referencedColumnName = "id")
	private User User;

}
String hql = "FROM User";
Query query = session.createQuery(hql);
List<User> users = query.list();

Para obtener una lista de usuarios, activará 1 consulta para cargar todos los usuarios de usuario tabla, luego ejecute N consultas para cargar la lista de direcciones para cada usuario de Dirección table, termina ejecutando consultas N+1

Resolver N+1

Algunas de las estrategias seguidas para solucionar el problema de N+1 SELECT son:

  1. @EntityGraph proporciona una forma de formular consultas de mejor rendimiento definiendo qué entidades se deben recuperar de la base de datos mediante SQL JOINS.
  2. Otra forma de usar @BatchSize en la asociación perezosa para buscar los registros en lotes, lo que nos ayuda a reducir el problema de N+1 a (N/K)+1 donde K se refiere al tamaño del lote.
  3. Como último recurso, intente evitar o deshabilitar la carga diferida por completo.

Si quieres conocer otros artículos parecidos a Preguntas de la entrevista de Hibernate - Conceptos de codificación N puedes visitar la categoría Tutoriales.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir

Esta página web utiliza cookies para analizar de forma anónima y estadística el uso que haces de la web, mejorar los contenidos y tu experiencia de navegación. Para más información accede a la Política de Cookies . Ver mas