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」この部分に達しました。私は顧客を保存し、他の2つのテーブルに同じエントリを設定しています。顧客テーブルの主キーは、他の 2 つのテーブルの外部キーです。迷ってます助けてください。

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 を生成するためにどの戦略を使用するかを再考する必要があります。sequenceまたは戦略を使用nativeすると、問題を解決できます。

于 2013-04-02T09:01:30.400 に答える