Получение исключения дубликата ключа при выполнении транзакции JDBC - PullRequest
0 голосов
/ 16 декабря 2018

Я пытаюсь добавить обозначение и его зарплату с помощью транзакции JDBC.Проблема в том, что это вызывает исключение из-за дублированного ключа.

Это первый раз, когда я помещаю некоторые недопустимые данные в столбцы зарплаты, и после этого все правильно.Он показывает исключение дублирующегося ключа для идентификатора идентификатора, но идентификатор назначения еще не сохранен и даже для первой попытки.Первая недействительная транзакция откатывается, но при следующем сохранении она показывает исключение дублирующегося ключа.

Ниже приведен мой код: -

  public boolean addDesignation(ObservableList nodeList) throws SQLException {
        Connection demo = getConnection();
        demo.setAutoCommit(false);
        Savepoint savePoint = demo.setSavepoint("savePoint");
        try {
        PreparedStatement addDesig =  demo.prepareStatement(
                "INSERT INTO `designation`(`desig_id`,`dept_id`,`desig_name`,`desig_desc`) VALUES (?,?,?,?)");
        PreparedStatement addSal =  demo.prepareStatement("INSERT INTO `salary` "
                + "(`desig_id`, `basic`, `house_rent`, `conveyance`, `medical`, `dearness`,`others_allowances`,"
                + " `income_tax`, `pro_tax`, `emp_state_insu`, `absence_fine`, `others_deductions`, `month`)"
                + " VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)");

        addDesig.setString(1 , nodeList.get(0).toString());
        addDesig.setString(2,  nodeList.get(1).toString());
        addDesig.setString(3, nodeList.get(2).toString());
        addDesig.setString(4,  nodeList.get(3).toString());
        addDesig.executeUpdate();

        addSal.setString(1, nodeList.get(0).toString());
        addSal.setInt(2, Integer.parseInt(nodeList.get(4).toString()));
        addSal.setInt(3, Integer.parseInt(nodeList.get(5).toString()));
        addSal.setInt(4, Integer.parseInt(nodeList.get(6).toString()));
        addSal.setInt(5, Integer.parseInt(nodeList.get(7).toString()));
        addSal.setInt(6,Integer.parseInt(nodeList.get(8).toString()));
        addSal.setInt(7,Integer.parseInt(nodeList.get(9).toString()));
        addSal.setInt(8, Integer.parseInt(nodeList.get(10).toString()));
        addSal.setInt(9, Integer.parseInt(nodeList.get(11).toString()));
        addSal.setInt(10, Integer.parseInt(nodeList.get(12).toString()));
        addSal.setInt(11, Integer.parseInt(nodeList.get(13).toString()));
        addSal.setInt(12, Integer.parseInt(nodeList.get(14).toString()));
        addSal.setString(13, nodeList.get(15).toString());
        addSal.executeUpdate();
         demo.commit();

         return true;

    } catch (SQLException ex) {
        demo.rollback(savePoint);

        Logger.getLogger(DatabaseHandler.class.getName()).log(Level.SEVERE, null, ex);
    }

    return false;
}

это две таблицы ия пытаюсь добавить эти данные в моей первой попытке не удалось, но не сохранить из-за отката

1 Ответ

0 голосов
/ 16 декабря 2018

В вашем коде 2 INSERT операторов.1-е для таблицы designation:

"INSERT INTO `designation`(`desig_id`,`dept_id`,`desig_name`,`desig_desc`) VALUES (?,?,?,?)"

здесь похоже, что desig_id - это первичный ключ (может быть автоинкремент, в этом случае вы вообще не должны указывать значение).Вы уверены, что значение, которое вы указываете для этого столбца, еще не существует в таблице?2-е для таблицы salary:

"INSERT INTO `salary` " + "(`desig_id`, `basic`, `house_rent`, `conveyance`, `medical`, `dearness`,`others_allowances`," + " `income_tax`, `pro_tax`, `emp_state_insu`, `absence_fine`, `others_deductions`, `month`)" + " VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)"

, в этом случае неясно, поскольку вы не опубликовали оператор таблицы CREATE, который является первичным ключом.Поэтому вы должны проверить, нарушает ли значение (или значения, если это ключ с несколькими столбцами) уникальность ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...