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.
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:Aquí,
myClassParentRepository
es una instancia de tu interfazMyClassParentRepository
, 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.