porque este problema
En el proceso de desarrollo de Java, al encontrar algunas situaciones de copiar objetos y copiar datos, o encontrar una operación de bucle basada en el valor del objeto anterior y asignar un valor nuevo, aparecerá el valor del objeto en la lista de objetos asignados. Es exactamente el mismo, incluso el valor del último objeto.
Incorrecto代码示例
ProjectEntity projectEntity = this.selectById(id);
List<ProjectEntity> projectEntities = new ArrayList<>();
userIds.forEach(item->{
projectEntity.setCreateBy(item);
projectEntities.add(projectEntity);
});
this.insertBatch(projectEntities);
A partir del código anterior,
el primer paso: encontrar un valor de objeto básico de la base de datos de acuerdo con el Id.
El segundo paso: atravesar el ciclo, modificar el contenido del campo createBy del objeto a su vez y escribir los primeros datos en el primer elemento de la lista Dentro... los segundos datos se escriben en el segundo elemento... y así sucesivamente
Paso 3: finalice el bucle e insértelo en la base de datos en forma de una operación transversal
Resultado : los datos insertados en la base de datos son exactamente los mismos y son todos los valores del último objeto
Análisis de causa
Debido a que solo se especifica una dirección de memoria antes de colocarse en el ciclo for, los datos originales se sobrescriben en una dirección de memoria cada vez, por lo que siempre se obtiene el último valor del ciclo.
En otras palabras, lo que se opera en el bucle es solo una referencia, no un "valor" como lo entendemos.
Solución
1. En el cuerpo del bucle, cada bucle debe inicializar primero un nuevo objeto, es decir, volver a poner el objeto nuevo y dejar que obtenga una nueva dirección.
userIds.forEach(item->{
ProjectEntity projectEntity = new ProjectEntity();
projectEntity.setCreateBy(item);
projectEntities.add(projectEntity);
});
this.insertBatch(projectEntities);
Este método es correcto, pero creo que simplemente resuelve el problema, pero no resuelve la demanda.
De hecho, lo que más queremos es poder retener los datos de los objetos obtenidos de la base de datos, y modificar los datos basados en ellos, y finalmente insertar N piezas de datos nuevos en la base de datos.
respuesta de referencia
//根据id获取方案基本信息
ProjectEntity projectEntity = this.selectById(id);
List<ProjectEntity> projectEntities = new ArrayList<>();
userIds.forEach(item->{
//初始化新的对象引用 使用hutool的实体内容复制
ProjectEntity newProjectEntity= Convert.convert(ProjectEntity.class,projectEntity);
newProjectEntity.setCreateBy(item);
projectEntities.add(newProjectEntity);
});
this.insertBatch(projectEntities);