【问题标题】:Saving THEN updating entity in Spring Data在 Spring Data 中保存 THEN 更新实体
【发布时间】:2016-02-03 12:58:37
【问题描述】:

我正在尝试在 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 是否可行的任何想法?

提前感谢您的任何建议。

【问题讨论】:

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


    【解决方案1】:

    所以问题的根源在于将 UUID 作为 ID。我的 ID 类的相关位是:

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

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

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

    或者谁有更深入的了解,请分享。

    【讨论】:

    • 其实我只是把它从UUID类型改成了String类型,一切正常。
    猜你喜欢
    • 2018-04-20
    • 1970-01-01
    • 2019-09-30
    • 2013-05-09
    • 1970-01-01
    • 2019-12-21
    • 2023-03-07
    • 2019-11-08
    • 1970-01-01
    相关资源
    最近更新 更多