Попытка вставить идентификатор и получить "не может принять значение NULL"

102
11

Я пытаюсь вставить запись в базу данных Derby с автоматически сгенерированным ключом, и я получаю эту ошибку:


Исключение в потоке "main" java.sql.SQLIntegrityConstraintViolationException: Столбец "CUSTOMERID" не может принимать значение NULL.     at org.apache.derby.client.am.SQLExceptionFactory.getSQLException(Неизвестный источник)     at org.apache.derby.client.am.SqlException.getSQLException(Неизвестный источник)     at org.apache.derby.client.am.ClientPreparedStatement.executeUpdate(Неизвестный источник)     в jakub.ordereditor.OrderEditorMain.create(OrderEditorMain.java:54)     в jakub.ordereditor.OrderEditorMain.main(OrderEditorMain.java:39) Причина: ERROR 23502: Столбец CUSTOMERID не может принимать значение NULL.     at org.apache.derby.client.am.ClientStatement.completeExecute(Неизвестный источник)     at org.apache.derby.client.net.NetStatementReply.parseEXCSQLSTTreply(Неизвестный источник)     at org.apache.derby.client.net.NetStatementReply.readExecute(Неизвестный источник)     at org.apache.derby.client.net.StatementReply.readExecute(Неизвестный источник)     at org.apache.derby.client.net.NetPreparedStatement.readExecute_ (Неизвестный источник)     at org.apache.derby.client.am.ClientPreparedStatement.readExecute(Неизвестный источник)     at org.apache.derby.client.am.ClientPreparedStatement.flowExecute(Неизвестный источник)     at org.apache.derby.client.am.ClientPreparedStatement.executeUpdateX(Неизвестный источник)     ... 3 больше



Я последовал за этим ответом: qaru.site/questions/3507/... и многие другие.
Моя часть кода:


package jan.ordereditor;

import jan.ordereditor.customer.entity.Customer;
import jan.ordereditor.customer.entity.CustomerName;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class OrderEditorMain {

/**
* @param args the command line arguments
*/
public static void main(String[] args) throws SQLException {

Customer customer = new Customer();

CustomerName customerFullName = new CustomerName();
customerFullName.setCustomerFirstName("John");
customerFullName.setCustomerSurname("Doe");

customer.setCustomerFullName(customerFullName);

create(customer);

}

public static void create(Customer customer) throws SQLException {
String SQL_INSERT = "INSERT INTO customer (customerFirstName, customerSurname) VALUES (?,?)";
try (
Connection connection = DriverManager.getConnection("jdbc:derby://localhost:1527/OrderEditor");
PreparedStatement statement = connection.prepareStatement(SQL_INSERT,
Statement.RETURN_GENERATED_KEYS);) {
CustomerName customerFullName = customer.getCustomerFullName();
statement.setString(1, customerFullName.getCustomerFirstName());
statement.setString(2, customerFullName.getCustomerSurname());

int affectedRows = statement.executeUpdate();

if (affectedRows == 0) {
throw new SQLException("Creating user failed, no rows affected.");
}

try (ResultSet generatedKeys = statement.getGeneratedKeys()) {
if (generatedKeys.next()) {
customer.setCustomerId(generatedKeys.getInt(1));
} else {
throw new SQLException("Creating user failed, no ID obtained.");
}
}
}
}

}


и мой идентификатор DB в базе данных Derby:


введите описание изображения здесь

спросил(а) 2021-01-19T17:16:45+03:00 9 месяцев, 1 неделя назад
1
Решение
79

Вам нужно удалить и readd столбец customerid в таблице как столбец идентификатора.


Пример:

ALTER TABLE TableName add customerid int identity(1,1)

Начиная с 1, для каждой вставки значение будет увеличено на 1.

ответил(а) 2021-01-19T17:16:45+03:00 9 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема