java - 修补实体并获取重复的项目

标签 java spring hibernate spring-boot jpa

我在编辑实体时遇到问题。我有具有不同条件的 ObjectSpecifications。我遇到的问题与DimensionalConditions有关。

每当我编辑一个包含“长度:1”的 ObjectSpecification 时,我尝试向其中添加“宽度:2”,条件最终会变为“长度:1,长度:1,宽度:2”。

长话短说,之前存在的条件由于某种原因再次插入。

public ObjectSpecification modifySpecification(Long id, ObjectSpecificationRequest request) {
        ObjectSpecification objectSpecification = this.getObjectSpecificationById(id);
        return this.setSpecData(request, objectSpecification);
    }

public ObjectSpecification createSpecification(ObjectSpecificationRequest request){
        return this.setSpecData(request, new ObjectSpecification());
    }

public void deleteSpecification(Long id) {
        objectSpecificationRepository.delete(getObjectSpecificationById(id));
    }

public ObjectSpecification setSpecData(ObjectSpecificationRequest request, ObjectSpecification objectSpecification) {
        if (request.getName() != null) {
            objectSpecification.setName(request.getName());
        }

        if (request.getDimensionalConditions() != null) {
            List<DimensionalCondition> dimensionalConditions = new ArrayList<>();
            for (DimensionalCondition condition:request.getDimensionalConditions()) {
                DimensionalCondition dimensionalCondition = new DimensionalCondition();
                dimensionalCondition.setConditionType(condition.getConditionType());
                dimensionalCondition.setValue(condition.getValue());
                dimensionalCondition.setObjectSpecification(objectSpecification);
                dimensionalConditions.add(dimensionalCondition);
            }
            objectSpecification.setDimensionalConditions(dimensionalConditions);
        }

        if (request.getMechanisms() != null) {
            objectSpecification.setMechanismConditions(request.getMechanisms());
        }

        if (request.getServices() != null) {
            objectSpecification.setServiceConditions(request.getServices());
        }

        if (request.getWorkDetails() != null) {
            List<WorkDetail> workDetails = new ArrayList<>();
            for (WorkDetail workDetail:request.getWorkDetails()) {
                workDetails.add(workDetailService.getWorkDetailById(workDetail.getId()));
            }
            objectSpecification.setWorkDetailConditions(workDetails);
        }

        return objectSpecificationRepository.save(objectSpecification);
    }

最佳答案

1) 这是一个很大的更新列表,请确保合并您的 ObjectSpecification使其与 PersistenceContext 对齐在进行任何修改之前。

2) 您没有考虑现有的 DimensionalCondition链接到 ObjectSpecification 。您总是创建一个新的:

List<DimensionalCondition> dimensionalConditions = new ArrayList<>();

3) 确保您的级联配置为 {PERSIST, MERGE}至少在 @OneToMany List<DimensionalCondition>

关于java - 修补实体并获取重复的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56373049/

相关文章:

java - 处理大型文本文件的有效方法是什么?

java - 在 Java 中使用数组添加两个 10 位数字

java - Google App Engine 上的 Spring Boot REST 抛出 502

java - 如何拦截类型或方法的元注释

java - 如何跟踪 webServiceTemplate 发送的 SOAP 请求

java - 使用 Hibernate 查询 H2

java - hibernate : Error applying BeanValidation relational constraints

java - 在分层 Spring MVC Web 应用程序中处理 Hibernate session 的最佳方式

java - 将 #text 从 getNodeName 转换为字符串

java - Hibernate:在多对多关系中添加实体会导致另一个实体不必要的更新