在Spring Data中保存THEN更新实体

时间:2016-02-03 12:58:37

标签: java spring hibernate spring-mvc spring-data

我尝试在Spring Data应用中模拟数据导入的进度,但我无法解决Hibernate StaleStateException的问题。大概是因为一旦保存了原始的Progress实体(Id是一个自动生成的UUID),它就会变得分离。

由于Spring负责幕后的所有事务/会话逻辑,我发现很难处理实际发生的事情。

例如,我想做类似的事情:

Progress progress = new Progress();
progress.setStartTime(new Date());

int recordsProcessed = 0;
while(!importFinished) {
    // import ten records
    recordsProcessed += 10;

    progress.setRecordsProcessed(recordsprocessed);
    progressRepository.save(progress);
}

progress.setEndTime(new Date());
progressRepository.save(progress);

ProgressRepository延伸CrudRepository/JpaRepository

这样,如果导入在任何阶段失败,我将在数据库中记录导入失败的记录,并且我也可以批量保存,以便整个导入不会回滚,需要重新运行。

关于这是否可以在Spring Data

中提出任何想法

提前感谢任何建议。

1 个答案:

答案 0 :(得分:0)

事实证明问题的根源在于将UUID作为ID。我的ID类的相关位是:

@MappedSuperclass
public class AbstractEntity {
    @Id @GeneratedValue(generator="uuid2")
    @GenericGenerator(name = "uuid2", strategy = "uuid2")
    protected UUID uuid;
}

一旦我用正常的长自动增量替换UUID,一切正常。

非常痛苦的错误 - 我特别想到MySQL以及它如何处理存储UUID(BINARY(255)) - 所以希望这能为其他人节省很多时间!

或者任何人对此有更深入的了解,请分享。