【问题标题】:in case of violation in saveAll() in spring boot hibernate如果在 spring boot hibernate 中违反 saveAll()
【发布时间】:2020-12-24 09:38:44
【问题描述】:

我目前正在开发 Spring Boot Hibernate。

我需要在 mySql 数据库中保存一个对象列表, 我读到了使用 saveAll() 和 foreach save() 保存之间的区别,我可以得出结论 saveAll() 要快得多。但是,如果出现异常情况,例如 UK 违规,整个过程会回滚,并且不会保存任何对象。

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

这是我的实体:

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();

}

谢谢你:)

【问题讨论】:

    标签: spring-boot hibernate jpa


    【解决方案1】:

    您可以在调用 saveAll() 的控制器方法上使用 Spring 的 @Transactional(noRolbackFor={SomeException.class})

    【讨论】:

    • 不起作用。我试过@Transactional(noRolbackFor={Exception.class})
    猜你喜欢
    • 2021-03-10
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2019-09-04
    • 2019-07-25
    • 1970-01-01
    • 2020-05-06
    相关资源
    最近更新 更多