2

当应用程序尝试在数据库中插入记录行时出现以下错误。

SQL Error: 1062, SQLState: 23000
ERROR org.hibernate.util.JDBCExceptionReporter  - Duplicate entry '7089' for key      'PRIMARY'
ERROR org.hibernate.event.def.AbstractFlushingEventListener  - Could not synchronize   database state with session
Caused by: java.sql.BatchUpdateException: Duplicate entry '7090' for key 'PRIMARY'
    at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1269)
    at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:955)
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:242)

定义是

@Id
@Column(name = "CST_CUSTOMER_ID_PK")
@GenericGenerator(name = "generator", strategy = "increment")
@GeneratedValue(generator = "generator")
public Long getId() {
    return id;
}

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

发生错误的部分是:

savedCustomer = customerDao.save(customer);
            mtmrsLogger.debug("saved customer id:" + savedCustomer.getId());
            /**
             * Updating Customer Trans Table
             */
            updateCustomerTransForMakerChecker(customer,     customerform.getAuditDetails());

            /**
             * Updating Customer Audit
             */
            updateCustomerAuditForMakerChecker(customer, customerform.getAuditDetails());
            //status=1;
            //Add customer ewallet account
            updateCustomerInWalletBalance(customer, customerform.getAuditDetails());
            //send sms to customer
            smsManager.sendSMSToCUCustomer(customer.getMobileno(), userBean);
        }
        mtmrsLogger.exiting("CustomerManagerImpl", "addCustomer");

我的日志显示,程序已经到了 'Exiting Class: CustomerManagerImpl Method: addCustomer' 这部分。我保存了客户,我在其他两个表中设置了相同的条目。客户表的主键是其他两个表的外键。我迷路了请帮忙。

CREATE TABLE `CST_CUSTOMER_INFO` (
`CST_CUSTOMER_ID_PK` bigint(11) NOT NULL AUTO_INCREMENT,
`CST_MOBILE` varchar(30) DEFAULT NULL,
   `CST_FIRST_NAME` varchar(50) DEFAULT NULL,
`CST_LAST_NAME` varchar(150) NOT NULL,
`CST_MIDDLE_NAME` varchar(50) DEFAULT NULL,
PRIMARY KEY (`CST_CUSTOMER_ID_PK`)
) ENGINE=InnoDB AUTO_INCREMENT=4103 DEFAULT CHARSET=latin1

我在生产中偶尔会出错,但在本地没问题..

4

2 回答 2

3

由于表格被多个应用程序修改,使用@GenericGenerator(name = "generator", strategy = "increment")将导致歧义。

解释

策略增量:它生成类型为 long、short 或 int 的标识符,这些标识符仅在没有其他进程将数据插入同一个表时才是唯一的。它不应该在集群环境中使用。

因此,您应该重新考虑使用什么策略来生成 id。使用sequencenative策略可以解决您的问题。

于 2013-04-02T09:01:30.400 回答
-1

代替

`CST_CUSTOMER_ID_PK` bigint(11) NOT NULL AUTO_INCREMENT,

`CST_CUSTOMER_ID_PK` bigint(11) NOT NULL,

您正在使用 hibernate/java 增加 id,不需要让 DBMS 也增加它。

于 2013-04-02T08:44:15.780 回答