当前位置: 首页 > 知识库问答 >
问题:

如果在spring boot hibernate中saveAll()发生冲突

鲜于阳
2023-03-14

我目前正在做一个spring boot冬眠。

我需要在mySql数据库中保存一个对象列表,我了解了使用saveAll()和foreach save()进行保存的区别,我可以得出这样的结论:saveAll()要快得多。然而,在例外情况下,例如UK违反,整个进程回滚,并且没有对象将被保存。

更简单地说:我想在一个事务中保存一个object列表,如果有任何约束违反,忽略它并保存其余的。

这是我的实体:

package com.entity;

import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Parameter;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
@Transactional
public class Page {

@Id
@GeneratedValue(generator = "page_sequence-generator")
@GenericGenerator(
        name = "page_sequence-generator",
        strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
        parameters = {
                @Parameter(name = "sequence_name", value = "page_sequence"),
                @Parameter(name = "initial_value", value = "1"),
                @Parameter(name = "increment_size", value = "1")
        }
)
private long id;

@Column(nullable = false, unique = true)
private String url;

private boolean isPageConsumed;

public Page() {
}

public Page(String url, boolean isPageConsumed) {
    this.url = url;
    this.isPageConsumed = isPageConsumed;
}

public long getId() {
    return id;
}

public void setId(long id) {
    this.id = id;
}

public String getUrl() {
    return url;
}

public void setUrl(String url) {
    this.url = url;
}

public boolean isPageConsumed() {
    return isPageConsumed;
}

public void setPageConsumed(boolean pageConsumed) {
    isPageConsumed = pageConsumed;
}

@Override
public String toString() {
    return "Page{" +
            "id=" + id +
            ", url='" + url + '\'' +
            ", isPageConsumed=" + isPageConsumed +
            '}';
}
}

这是我的存储库:

@Repository
public interface PageRepository extends CrudRepository<Page, String> {

@Query(value = "SELECT p FROM Page p where p.isPageConsumed = '0'")
public Page findFirstPage();

}

谢谢:)

共有1个答案

舒宏富
2023-03-14

您可以在调用saveAll()的controller方法上使用spring的@transactional(NorolBackFor={someException.class})

 类似资料:
  • 问题内容: 创建Elasticsearch Client时,出现异常java.lang.NoSuchMethodError:com.google.common.util.concurrent.MoreExecutors.directExecutor()Ljava / util / concurrent / Executor; 经过一些查找之后,像Guava-18这样的接缝将在运行时被旧版本覆盖,而

  • 我在Postgres db中有一个没有主键的表。我想更新两列的组合是否具有相同的值。 没有主键我找不到任何东西。另外,col1和col2的组合是唯一的。col1可以有多行,值相同,col2可以有多行,但一起不能。 我的桌子是这样的: 我不能对这两列中的任何一列都有唯一的约束,但将索引以组合方式添加在一起的工作原理如下: 但是现在,如何处理插入。什么应该是条件,因为我们不能有2列,所以回到同一个问题

  • 既然有一个,那么当使用时,有没有办法刷新更新的实体? 我试图按批处理更新实体。 真的会有很大的帮助! 非常感谢。

  • 问题内容: 创建Elasticsearch Client时,出现异常java.lang.NoSuchMethodError:com.google.common.util.concurrent.MoreExecutors.directExecutor()Ljava / util / concurrent / Executor; 经过一些查找之后,像Guava-18这样的接缝在运行时会被旧版本覆盖,而

  • 我正在从国家美术馆的在线目录中检索信息。由于目录的结构,我无法通过提取和跟踪条目之间的链接来导航。幸运的是,集合中的每个对象都有一个可预测的url。我希望我的爬行器通过生成开始URL来导航集合。 我试图通过实现这个线程中的解决方案来解决我的问题。不幸的是,这似乎打破了我蜘蛛的另一部分。错误日志显示我的网址正在成功生成,但它们没有被正确处理。如果我正确地解释了日志——我怀疑我没有——在重新定义允许我

  • 在我的生产Cassandra集群(10个节点)中,我经常获得。因此,为了在我的本地开发环境(四个节点的Cassandra集群)中重现这个问题,我运行了我的代码,然后停止了两个CassandRadaemon。我有以下例外 线程“main”com.datastax.driver.core.exceptions.unavailableException:在com.datastax.driver.core