jpa 的 save 方法

Java框架

浏览数:114

2019-4-1

错误代码如下所示,当时写的时候想着让对象初始化的次数少一点,想着用一个对象。

ScoreSummary scoreSummary = new ScoreSummary();
// 为每个班级新增成绩汇总
for (Klass klass: courseArrangement.getKlassList()) {
    scoreSummary.setCourseArrangement(courseArrangement);
    scoreSummary.setKlass(klass);
    scoreSummaryRepository.save(scoreSummary);
}

后来潘老师评论说这样只会保存一个对象,之后的会更新。才突然想到这个问题,其实之前是有用到的

logger.info("保存");
CourseArrangement assertCourseArrangement = courseArrangementService.save(courseArrangement);

logger.info("断言保存成功");
assertThat(assertCourseArrangement.getId()).isNotNull();
logger.info("保存");
courseArrangementService.save(courseArrangement);

logger.info("断言保存成功");
assertThat(courseArrangement.getId()).isNotNull();

你穿入的对象和你返回的是一个对象。

之后看了一下源码,感觉大概应该是我注释的意思。

@Transactional
public <S extends T> S save(S entity) {
    if (this.entityInformation.isNew(entity)) { // 判断是否是新建的实体 
        this.em.persist(entity);                // 如果是新增
        return entity;
    } else {
        return this.em.merge(entity);            // 如果不是更新
    }
}