entitymanager.merge()的行为与我的预期不符(创建新记录而不是更新)

时间:2014-11-04 17:54:46

标签: java postgresql jpa merge eclipselink

我无法找到任何相关的搜索内容。我正在进行批量插入和/或更新,具体取决于是否存在基于从导出的CSV读入的数据的先前记录。

以下内容将两条记录保存在数据库中,而我希望它插入并更新同一条记录。

如果数据库中已有记录,则按预期工作,只更新现有行。

以前,我正在检查是否为null,只是在if / else中进行插入/更新,一切正常。这在setter中有很多冗余,所以我把它改成了这个。我希望它将始终运行更新,但如果找不到记录,它将创建一个随后更新的最低可行病理记录。更新工作正常 - 问题是当没有先前记录存在时,它会创建一个额外的记录。

这是因为合并和提交交易的地点和方式?我不明白为什么第二次合并创建一个新的插入时,我传递一个必须已存在的更新对象。

我可以按照自己的意愿使一切正常运转,但我想更好地理解为什么这并不像我期望的那样表现。我是否错过了合并和交易的核心概念?

这是我的代码。

        Pathology pathology = getPathology(entityManager, slideId, mdCallString, CALLTYPE);

        if(null==pathology) {
            entityManager.getTransaction().begin();
                pathology = new Pathology();
                pathology.setSlideId(slideId);
                pathology.setCallType(CALLTYPE);
                pathology.setCallBy(mdCallString);
            entityManager.merge(pathology);
            entityManager.getTransaction().commit();
        }

        entityManager.getTransaction().begin();
            pathology.setSample(sample);
            pathology.setSlides(slides);
            pathology.setLocation(location);
            pathology.setCallDx(sampleLevelDx);
            pathology.setPatientDx(patientLevelDx);
            pathology.setRadiologyReports(radiologyReports);
            pathology.setModality(MODALITY);
            pathology.setUpdatedOn(new Date());
            String dtm = lineContainer.get(lineContainer.size() - 1);
            DateFormat sdf = new SimpleDateFormat("MM/dd/yyyy hh:mm a", Locale.US);
            Date callDate = sdf.parse(dtm);
            pathology.setCallDate(callDate);
            if(mdCallString==colbyCallString) {
                pathology.setRepresentativeSlideDigitized(currentSlide.get(3));
            }
        entityManager.merge(pathology);
        entityManager.getTransaction().commit();

编辑:所以,如果我运行

,一切正常
        Pathology pathology = getPathology(entityManager, slideId, mdCallString, CALLTYPE);

        if(null==pathology) {
            entityManager.getTransaction().begin();
                pathology = new Pathology();
                pathology.setSlideId(slideId);
                pathology.setCallType(CALLTYPE);
                pathology.setCallBy(mdCallString);
            entityManager.merge(pathology);
            entityManager.getTransaction().commit();
        }

        pathology = getPathology(entityManager, slideId, mdCallString, CALLTYPE);

        entityManager.getTransaction().begin();
            pathology.setSample(sample);
            pathology.setSlides(slides);
            pathology.setLocation(location);
            pathology.setCallDx(sampleLevelDx);
            pathology.setPatientDx(patientLevelDx);
            pathology.setRadiologyReports(radiologyReports);
            pathology.setModality(MODALITY);
            pathology.setUpdatedOn(new Date());
            String dtm = lineContainer.get(lineContainer.size() - 1);
            DateFormat sdf = new SimpleDateFormat("MM/dd/yyyy hh:mm a", Locale.US);
            Date callDate = sdf.parse(dtm);
            pathology.setCallDate(callDate);
            if(mdCallString==colbyCallString) {
                pathology.setRepresentativeSlideDigitized(currentSlide.get(3));
            }
        entityManager.merge(pathology);
        entityManager.getTransaction().commit();

第二次,在检查为null的块之后。但我想避免重复。关于原始问题,在导致不同结果的两种情况下病理变量中传递的内容之间有什么区别?在这两种情况下,它们都引用了db中相同的现有记录 - 那么为什么一个会导致插入,而另一个会执行更新..

由于

0 个答案:

没有答案