首页 > 解决方案 > 插入多行 JPA Spring Boot Mysql

问题描述

我想在 mysql 中的同一个表中插入许多行并出现错误:

org.hibernate.StaleObjectStateException:行已被另一个事务更新或删除

代码是:

WpPostmeta wpPostmeta = new WpPostmeta();
wpPostmeta.setPostId(wpPosts.getId());
wpPostmeta.setMetaKey("_sku");
wpPostmeta.setMetaValue("");

wpPostmetaService.saveOrUpdate(wpPostmeta);

wpPostmeta.setPostId(wpPosts.getId());
wpPostmeta.setMetaKey("_regular_price");
wpPostmeta.setMetaValue(reqularPrice[0]);

wpPostmetaService.saveOrUpdate(wpPostmeta);

服务是:

public WpPostmeta saveOrUpdate(WpPostmeta wpPostmeta){

    wpPostmetaRepository.save(wpPostmeta);
    wpPostmetaRepository.flush();
    return wpPostmeta;


}

接口是:

公共接口 WpPostmetaRepository 扩展 JpaRepository {

@Query(value = "Select * from wp_postmeta where post_id = ?1", nativeQuery = true){}

我应该如何将许多行一一插入到同一张表中?

标签: mysqlspringhibernatejpa

解决方案


此代码正在更新相同的记录。它只是一行

WpPostmeta wpPostmeta = new WpPostmeta();
wpPostmeta.setPostId(wpPosts.getId());
wpPostmeta.setMetaKey("_sku");
wpPostmeta.setMetaValue("");

wpPostmetaService.saveOrUpdate(wpPostmeta);

wpPostmeta.setPostId(wpPosts.getId());
wpPostmeta.setMetaKey("_regular_price");
wpPostmeta.setMetaValue(reqularPrice[0]);

wpPostmetaService.saveOrUpdate(wpPostmeta);

如果你想要多行它会是这样的

WpPostmeta wpPostmeta = new WpPostmeta();
wpPostmeta.setPostId(wpPosts.getId());
wpPostmeta.setMetaKey("_sku");
wpPostmeta.setMetaValue("");

wpPostmetaService.saveOrUpdate(wpPostmeta);

WpPostmeta wpPostmeta1 = new WpPostmeta();
wpPostmeta1.setPostId(wpPosts.getId());
wpPostmeta1.setMetaKey("_regular_price");
wpPostmeta1.setMetaValue(reqularPrice[0]);

wpPostmetaService.saveOrUpdate(wpPostmeta1);

相反,您可以使用类似这样的 saveAll 方法

List<WpPostmeta> lstRecord = new ArrayList<WpPostmeta>();

WpPostmeta wpPostmeta = new WpPostmeta();
wpPostmeta.setPostId(wpPosts.getId());
wpPostmeta.setMetaKey("_sku");
wpPostmeta.setMetaValue("");
lstRecord.add(wpPostmeta);


WpPostmeta wpPostmeta1 = new WpPostmeta();
wpPostmeta1.setPostId(wpPosts.getId());
wpPostmeta1.setMetaKey("_regular_price");
wpPostmeta1.setMetaValue(reqularPrice[0]);
lstRecord.add(wpPostmeta1);


saveAll(lstRecord);


public Boolean saveAll(List<WpPostmeta> lstData){
    wpPostmetaRepository.saveAll(lstData);
    return true;
}

推荐阅读