es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Entidad con una referencia propia de uno a muchos, problema de guardar en cascada de todos los elementos.

Estoy tratando de guardar una lista de MyClass. Tiene una referencia propia de muchos a uno, y cuando intento guardar la lista con cascada persist, la clase padre se agrega varias veces, con cada uno de sus hijos, en lugar de solo una vez.

@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class MyClass{
@Id
@GeneratedValue(generator = "automotiveparts_sequence", strategy = GenerationType.SEQUENCE)
@SequenceGenerator(
        name = "automotiveparts_sequence",
        sequenceName = "automotiveparts_sequence",
        allocationSize = 50
)
private Long id;

@ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "myclass_parent_id")
private MyClassparent;
}

@Service
@RequiredArgsConstructor
@Slf4j
public class MyClassService {
private final MyClassRepository myClassRepository;
private final MyClassMapper myClass1Mapper;

@Transactional
public void importProcess(List<myclass1dto> imports) {
    myClassRepository.saveAll(imports.stream()
            .map(m -> {
                MyClass myClass = mapDtoToEntity(m);
                return myClass;
            })
            .collect(Collectors.toList()));
}
}

Creo que sucede porque estoy creando el objeto padre varias veces, pero no puedo pensar en una manera simple de hacerlo.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una solución es verificar primero si el objeto padre ya existe en la base de datos antes de crear uno nuevo. Puedes hacer esto agregando una comprobación en tu método mapDtoToEntity y obteniendo el objeto padre de la base de datos si ya existe.

    Por ejemplo, tu método mapDtoToEntity puede modificarse de la siguiente manera:

    private MyClass mapDtoToEntity(MyClass1Dto dto) {
        MyClass myClass = new MyClass();
    
        // Verificar si el padre ya existe en la base de datos
        Long parentId = dto.getParentId();
        MyClassparent parent = myClassParentRepository.findById(parentId)
                                        .orElseGet(() -> new MyClassParent(parentId)); // Crear nuevo padre si no se encuentra en la bd
        myClass.setMyClassparent(parent);
    
        // Establecer las propiedades restantes del objeto MyClass
        // ...
    
        return myClass;
    }
    

    Aquí, myClassParentRepository es una instancia de tu interfaz MyClassParentRepository, la cual proporciona acceso a la base de datos para el objeto padre.

    Con esta modificación, cuando llames a myClassRepository.saveAll para guardar la lista de objetos MyClass, se creará una sola instancia del objeto padre en la base de datos y todos los objetos hijos harán referencia al mismo padre.

Comments are closed.