[Desarrollo de Java] Asignación transversal de bucle de objeto Java, los valores son todos iguales y el valor del último objeto: resolución de problemas

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);

Supongo que te gusta

Origin blog.csdn.net/RayCongLiang/article/details/130266987
Recomendado
Clasificación