【问题标题】:Exception while executing batch update/insert on Hibernate/Oracle在 Hibernate/Oracle 上执行批量更新/插入时出现异常
【发布时间】:2016-04-07 13:37:44
【问题描述】:

我在将对象持久保存到数据库时遇到了一个异常,下面是代码库模型:

@Entity
@Table(name = "customer_data")
public class BsslpCustomerInfo {
    @Id
    @Column(name = "id", length = 10)
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    @Column(name = "service_Id", length = 50, unique = true, nullable = false)
    private String serviceId;

    @Column(name = "quarter", length = 255, nullable = false)
    private String quarter;

    @Column(name = "year")
    private int year;

    @Column(name = "activated_Customer_Name")
    private String activatedCustomerName;

    @Column(name = "deactivated_Customer_Name")
    private String deactivatedCustomerName;

    @Column(name = "quarter_Start_Date")
    private String quarterStartDate;

    @Column(name = "quarter_End_Date")
    private String quarterEndDate;

    public String getServiceId() {
        return serviceId;
    }

    public void setServiceId(String serviceId) {
        this.serviceId = serviceId;
    }

    public String getQuarter() {
        return quarter;
    }

    public void setQuarter(String quarter) {
        this.quarter = quarter;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public String getActivatedCustomerName() {
        return activatedCustomerName;
    }

    public void setActivatedCustomerName(String activatedCustomerName) {
        this.activatedCustomerName = activatedCustomerName;
    }

    public String getDeactivatedCustomerName() {
        return deactivatedCustomerName;
    }

    public void setDeactivatedCustomerName(String deactivatedCustomerName) {
        this.deactivatedCustomerName = deactivatedCustomerName;
    }

    public String getQuarterStartDate() {
        return quarterStartDate;
    }

    public void setQuarterStartDate(String quarterStartDate) {
        this.quarterStartDate = quarterStartDate;
    }

    public String getQuarterEndDate() {
        return quarterEndDate;
    }

    public void setQuarterEndDate(String quarterEndDate) {
        this.quarterEndDate = quarterEndDate;
    }

    public int getId() {
        return id;
    }

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

...这是“控制器”代码:

for (BsslpParty bsslp : data) {
    Date activationDate = sdf.parse(bsslp.getAssocStartDate());
    Date deactivationDate = sdf.parse(bsslp.getAssocEndDate());
    if(activationDate.compareTo(startDate)>=0 && activationDate.compareTo(endDate)<=0){
        activeCount++;
        BsslpCustomerInfo bsslpCustomerInfo = new BsslpCustomerInfo();
        bsslpCustomerInfo.setServiceId(bsslp.getBsslpName());
        bsslpCustomerInfo.setActivatedCustomerName(bsslp.getEntitledPartyName());
        bsslpCustomerInfo.setQuarter(quarterDateRange.getStartdate());
        bsslpCustomerInfo.setYear(quarterDateRange.getFinYear());
        bsslpCustomerInfo.setQuarterStartDate(quarterDateRange.getStartdate());
        bsslpCustomerInfo.setQuarterEndDate(quarterDateRange.getEndDate());
        listOfActDeActCust.add(bsslpCustomerInfo);              
    }

    usageMetricschartService.saveAllCustomerData(listOfActDeActCust);
}

“服务”实现:

@Override
@Transactional
public void saveAllCustomerData(List<BsslpCustomerInfo> customersData) {
    // TODO Auto-generated method stub

    for (BsslpCustomerInfo bsslpCustomerInfo : customersData) {
        usageMetricsCustomersRepository.save(bsslpCustomerInfo);
    }

}

它抛出一个错误,如:

java.sql.BatchUpdateException: ORA-01722: 无效号码

oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:343) org.springframework.dao.InvalidDataAccessResourceUsageException:无法执行批处理; SQL [插入customer_data (激活_客户_姓名,停用_客户_姓名,季度, Quarter_End_Date, Quarter_Start_Date, service_Id, year, id) 值 (?, ?, ?, ?, ?, ?, ?, ?)];嵌套异常是 org.hibernate.exception.SQLGrammarException:无法执行批处理

我尝试了所有可能的方法都无法解决这个问题;谁能帮我解决这个问题?

【问题讨论】:

    标签: java spring-data-jpa


    【解决方案1】:

    您已将您的 id 定义为自动生成,但是对于您创建的每个实体,您将 0 值传递给数据库。这是因为您使用的原语 inttype 默认初始化为 0。如果您为 id 字段设置值,则不会自动生成。

    将您的 id 属性更改为键入 Integer,以便在持久化时将 null 值发送到 JPA,这将导致生成 id。

    【讨论】:

      猜你喜欢
      • 2014-05-05
      • 2012-02-16
      • 2014-06-22
      • 2019-11-12
      • 2011-11-13
      • 1970-01-01
      • 1970-01-01
      • 2014-02-20
      • 2020-10-18
      相关资源
      最近更新 更多