我尝试在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
?
提前感谢任何建议。
答案 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)) - 所以希望这能为其他人节省很多时间!
或者任何人对此有更深入的了解,请分享。