Запросы Hibernate n + 1 после объяснения настройки fetchtype.lazyJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Запросы Hibernate n + 1 после объяснения настройки fetchtype.lazy

Сообщение Anonymous »

Я очень кратко:
У меня есть следующий вариант использования для моего приложения, где я обновляю объект с именем Turno (который представляет собой сдвиг на фабрике)

Код: Выделить всё

package com.gco.control_de_piso.application.use_cases.turno;

import com.gco.control_de_piso.application.DTOs.turno.ShowTurnoDto;
import com.gco.control_de_piso.common.results.implementations.Result;
import com.gco.control_de_piso.domain.constants.TurnoConstants.Estado;
import com.gco.control_de_piso.domain.entities.Turno;
import com.gco.control_de_piso.domain.repositories.ITurnoRepository;
import com.gco.control_de_piso.infrastructure.configuration.mapper.ITurnoMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Optional;
import java.util.UUID;

@Service
public class PausarTurnoUseCase {
private final ITurnoRepository turnoRepository;
private final ITurnoMapper turnoMapper;

public PausarTurnoUseCase(ITurnoRepository turnoRepository, ITurnoMapper turnoMapper) {
this.turnoRepository = turnoRepository;
this.turnoMapper = turnoMapper;
}

@Transactional
public Result execute(UUID turnoId) {
try {
Optional turnoOpt = turnoRepository.findById(turnoId);
if (turnoOpt.isEmpty()) {
return Result.failure("El turno no existe");
}

Turno turno = turnoOpt.get();

if (turno.getEstado() == Estado.PAUSADO && turno.getFechaFin() == null) {
return Result.failure("El turno ya está pausado");
}

turno.pause();

Turno savedTurno = turnoRepository.save(turno);

ShowTurnoDto turnoDto = turnoMapper.toShowTurnoDto(savedTurno);
return Result.success(turnoDto, "Turno pausado con éxito");
} catch (Exception e) {
return Result.failure("Error al pausar el turno: " + e.getMessage());
}
}
}
< /code>
Это мои сущности: < /p>
Turno
(shift):

Код: Выделить всё

package com.gco.control_de_piso.domain.entities;

import com.gco.control_de_piso.domain.constants.OrdenMaestraConstants.Etapa;
import com.gco.control_de_piso.domain.constants.TurnoConstants.Estado;
import com.gco.control_de_piso.domain.entities.auth.Usuario;
import com.gco.control_de_piso.domain.entities.base.BaseEntity;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;

@Data
@Entity
@Table(name = "turnos")
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false, onlyExplicitlyIncluded = true)
public class Turno extends BaseEntity {
@Id
@EqualsAndHashCode.Include
@GeneratedValue(strategy = GenerationType.UUID)
@Column(name = "turno_id", updatable = false, nullable = false)
private UUID turnoId;

@ManyToOne
@JoinColumn(name = "mesa_id", nullable = true)
private Mesa mesa;

@Column(name = "fecha_inicio", nullable = false)
private LocalDateTime fechaInicio;

@Column(name = "fecha_fin")
private LocalDateTime fechaFin;

@Enumerated(EnumType.STRING)
@Column(name = "estado", nullable = false)
private Estado estado = Estado.ACTIVO;

@Column(name = "etapa", nullable = false)
private Etapa etapa;

@ManyToMany(fetch = FetchType.LAZY )
@JoinTable(
name = "turnos_usuarios",
joinColumns = @JoinColumn(name = "turno_id"),
inverseJoinColumns = @JoinColumn(name = "usuario_id")
)
private Set  usuarios = new HashSet();

@ManyToOne
@JoinColumn(name = "usuario_creador_id", nullable = false)
private Usuario usuarioCreador;

@Column(name = "fecha_creacion", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP", nullable = false, updatable = false)
private LocalDateTime fechaCreacion = LocalDateTime.now();

@Override
public UUID getId() {
return this.turnoId;
}

public void start() {
this.fechaInicio = LocalDateTime.now();
this.estado = Estado.ACTIVO;
}

public void pause() {
this.estado = Estado.PAUSADO;
}

public void finish() {
this.fechaFin = LocalDateTime.now();
this.estado = Estado.FINALIZADO;
}

public void resume() {
this.estado = Estado.ACTIVO;
}

public void addUsuario(Usuario usuario) {
this.usuarios.add(usuario);
}

public void removeUsuario(Usuario usuario) {
this.usuarios.remove(usuario);
}

public boolean validarCapacidadEquipo() {
return this.usuarios.size() >= 1 && this.usuarios.size() 
Usuario
(пользователь):

Код: Выделить всё

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "USUARIOS")
public class Usuario extends BaseEntity {

@Id
@GeneratedValue(strategy = GenerationType.UUID)
@Column(name = "USUARIO_ID", updatable = false, nullable = false)
private UUID usuarioId;

@Column(name = "NOMBRE_USUARIO", nullable = false, unique = true, length = 50)
private String nombreUsuario;

@Column(name = "NOMBRES", nullable = false, length = 30)
private String nombres;

@Column(name = "APELLIDOS", nullable = false, length = 30)
private String apellidos;

@Column(name = "CEDULA", length = 11)
private String cedula;

@Column(name = "PASSWORD_HASH", nullable = false)
private String passwordHash;

@Column(name = "FECHA_CREACION", nullable = false)
private LocalDateTime fechaCreacion;

@Column(name = "FECHA_VIGENCIA", nullable = false)
private LocalDateTime fechaVigencia;

@Column(name = "CORREO", unique = true, length = 100)
private String correo;

@Column(name = "ACTIVO", nullable = false)
private boolean activo = false;

@Column(name = "FOTO_PERFIL", length = 300)
private String fotoPerfil;

@Column(name = "CELULAR", length = 10)
private String celular;

@Column(name = "cambiar_contrasena", nullable = false)
private boolean cambiarContrasena;

@OneToMany(mappedBy = "usuario", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
private Set ordenMaestraEtapas;

@Column(name = "FECHA_ULTIMO_ACCESO", nullable = true)
private LocalDateTime fechaUltimoAcceso;

@OneToMany(mappedBy = "usuario", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
private Set revisionesTrazo;

@OneToMany(mappedBy = "usuario", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
private Set impresionesPlotter;

@ManyToMany(fetch = FetchType.LAZY)
@BatchSize(size = 100)
@JoinTable(
name = "ROLES_USUARIOS",
joinColumns = @JoinColumn(name = "USUARIO_ID"),
inverseJoinColumns = @JoinColumn(name = "ROL_ID")
)
private Set  roles;

public Usuario(String nombreUsuario, String nombres, String apellidos, String cedula,
String correo, String celular, boolean activo) {
this.usuarioId = null;
this.nombreUsuario = nombreUsuario;
this.nombres = nombres;
this.apellidos = apellidos;
this.cedula = cedula;
this.passwordHash = passwordHash;
this.fechaCreacion = LocalDateTime.now();
this.fechaVigencia = LocalDateTime.now();
this.correo = correo;
this.activo = activo;
this.roles = new HashSet();
this.fotoPerfil = "";
this.celular = celular;
}

@Override
public UUID getId() {
return this.usuarioId;
}

public void actualizarFechaUltimoAcceso() {
this.fechaUltimoAcceso = LocalDateTime.now();
}
}
< /code>
I have worked with other ORMs and I don't think this should be a tricky case, I just need to retrieve the entity, update one of it's atributtes and then save and that's it, it should only take 1 select
и 1 обновление , нет?

Код: Выделить всё

Hibernate: select t1_0.turno_id,t1_0.estado,t1_0.etapa,t1_0.fecha_creacion,t1_0.fecha_fin,t1_0.fecha_inicio,m1_0.mesa_id,m1_0.capacidad_maxima,m1_0.numero_mesa,m1_0.tipo_extendido,t1_0.usuario_creador_id,uc1_0.usuario_id,uc1_0.activo,uc1_0.apellidos,uc1_0.cambiar_contrasena,uc1_0.cedula,uc1_0.celular,uc1_0.correo,uc1_0.fecha_creacion,uc1_0.fecha_ultimo_acceso,uc1_0.fecha_vigencia,uc1_0.foto_perfil,uc1_0.nombre_usuario,uc1_0.nombres,uc1_0.password_hash from turnos t1_0 left join mesas m1_0 on m1_0.mesa_id=t1_0.mesa_id join usuarios uc1_0 on uc1_0.usuario_id=t1_0.usuario_creador_id where t1_0.turno_id=?
Hibernate: select u1_0.turno_id,u1_1.usuario_id,u1_1.activo,u1_1.apellidos,u1_1.cambiar_contrasena,u1_1.cedula,u1_1.celular,u1_1.correo,u1_1.fecha_creacion,u1_1.fecha_ultimo_acceso,u1_1.fecha_vigencia,u1_1.foto_perfil,u1_1.nombre_usuario,u1_1.nombres,u1_1.password_hash from turnos_usuarios u1_0 join usuarios u1_1 on u1_1.usuario_id=u1_0.usuario_id where u1_0.turno_id=?
Hibernate:  select ome1_0.usuario_id,ome1_0.orden_maestra_etapa_id,ome1_0.activo,ome1_0.estado,ome1_0.etapa,ome1_0.fecha_fin,ome1_0.fecha_inicio,om1_0.orden_maestra_id,om1_0.ajustar_tela,om1_0.ano_temporada,om1_0.aprobacion_consumo,om1_0.clase_orden,om1_0.codigo_marca,om1_0.coleccion,ed1_0.orden_maestra_id,ed1_0.direccion,ed1_0.muestra_fisica,ed1_0.plantillas,ed1_0.talla_base,om1_0.fecha_actualizacion,om1_0.fecha_creacion,om1_0.fecha_inicio_trazo,om1_0.justificacion_consumo,l1_0.linea_id,l1_0.nombre_linea,l1_0.numero_linea,l1_0.precio,l1_0.valor_auxiliar,om1_0.material_anterior,om1_0.material_generico,om1_0.metros_tela_principal,om1_0.nt_telas,om1_0.nombre_marca,odt1_0.orden_maestra_id,odt1_0.bloques,odt1_0.fecha_actualizacion,odt1_0.fecha_creacion,odt1_0.fecha_elaboracion,odt1_0.observaciones,odt1_0.sesgos_json,odt1_0.tipo_prenda,oe1_0.orden_maestra_id,oe1_0.fecha_ingreso_papeleria,oe1_0.fecha_ingreso_trazo,oe1_0.incluye_muestra_fisica,oe1_0.metros,oe1_0.numero_piezas,oe1_0.precio_pieza,oe1_0.responsable_ingreso_papeleria,t1_0.id_tercero,t1_0.activo,t1_0.codigo,t1_0.direccion,t1_0.email,t1_0.fecha_creacion,t1_0.identificacion,t1_0.nombre,t1_0.telefono,t1_0.tipo_identificacion,t1_0.tipo_tercero,oe1_0.ubicacion_tela,om1_0.promedio_diseno,om1_0.reproceso,s1_0.sam_id,l2_0.linea_id,l2_0.nombre_linea,l2_0.numero_linea,l2_0.precio,l2_0.valor_auxiliar,s1_0.metros,s1_0.tipo_tejido,om1_0.segmento_stock,om1_0.temporada,om1_0.tipo_orden,om1_0.tipo_prenda,om1_0.unidad_medida,u1_0.usuario_id,u1_0.activo,u1_0.apellidos,u1_0.cambiar_contrasena,u1_0.cedula,u1_0.celular,u1_0.correo,u1_0.fecha_creacion,u1_0.fecha_ultimo_acceso,u1_0.fecha_vigencia,u1_0.foto_perfil,u1_0.nombre_usuario,u1_0.nombres,u1_0.password_hash,om1_0.utilizacion,ome1_0.posicion,ome1_0.prioridad from ordenes_maestras_etapas ome1_0 left join ordenes_maestras om1_0 on om1_0.orden_maestra_id=ome1_0.orden_maestra_id left join espigas_detalles ed1_0 on om1_0.orden_maestra_id=ed1_0.orden_maestra_id left join lineas l1_0 on l1_0.linea_id=om1_0.linea_id left join ordenes_de_trazo odt1_0 on om1_0.orden_maestra_id=odt1_0.orden_maestra_id left join ordenes_maestras_extendidas oe1_0 on om1_0.orden_maestra_id=oe1_0.orden_maestra_id left join terceros t1_0 on t1_0.id_tercero=oe1_0.id_tercero left join sams s1_0 on s1_0.sam_id=om1_0.sam_id left join lineas l2_0 on l2_0.linea_id=s1_0.linea_id left join usuarios u1_0 on u1_0.usuario_id=om1_0.usuario_id where ome1_0.usuario_id=?
[Skipped another 13 super long, useless queries]
< /code>
I kind of understand that it is loading all the related entities, since Turno
связан с USUARIO , а USUARIO связан со многими другими сущностями, но я явно установил все отношения USUARIO , чтобы быть обработанными. Я думаю, что это выходит из -под контроля ...
Я работал с .NET и никогда не имел такой проблемы с EFC (ORM Microsoft), поскольку для доступа к связанным объектам мне приходилось явно использовать. /> Я попытался настроить fetchtype.lazy , используя прогнозы DTO и интерфейса (но не настоящий поклонник того, как проекции работают на Springboot, если честно)
Я прочитал много других Решений>

Подробнее здесь: https://stackoverflow.com/questions/795 ... htype-lazy
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Двукеденный, бесконечно прокрутка, переменная Lazy Lazy Lazy Lazy Lazy Lazy - это возможно?
    Anonymous » » в форуме IOS
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Двукеденный, бесконечно прокрутка, переменная Lazy Lazy Lazy Lazy Lazy Lazy - это возможно?
    Anonymous » » в форуме IOS
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Запросы Hibernate n + 1 после объяснения настройки fetchtype.lazy
    Anonymous » » в форуме JAVA
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Запросы Hibernate n + 1 после объяснения настройки fetchtype.lazy
    Anonymous » » в форуме JAVA
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Java Spring HttpMessageNotWritableException/JsonMappingException с Hibernate FetchType.LAZY в процессе сериализации Джек
    Anonymous » » в форуме JAVA
    0 Ответы
    32 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»