java.sql.SQLIntegrityConstraintViolationException: Column 'id' cannot be null

делаю проект банкомат, но выдает ошибку java.sql.SQLIntegrityConstraintViolationException: Column 'id' cannot be null.

У меня всего 4 класса:

public class Account {
 
 
    
    private String firstName;
    
    private String lastName;
    
    private Integer balance;
    
    Account(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
    
    /*
    Registration of new user
    */
    public Boolean register() {
        try {
            Connection c = Database.connection();
            
            Statement stmt = c.createStatement();
            
            String sql = "INSERT INTO account VALUES (null, '" + this.firstName + "', '" + this.lastName + "')";
            
            stmt.executeUpdate(sql);
            
            
            Statement stmt2 = c.createStatement();
            String sql2 = "SELECT LAST_INSERT_ID()";
            ResultSet rs2 = stmt.executeQuery(sql2);
            
            Integer last_account_id = 0;
            
            while (rs2.next()) {
                last_account_id = rs2.getInt(1);
            }
            
            String cardNumber = this.generateCardNumber();
            
            String code = this.generatePincode();
            
            Statement stmt3 = c.createStatement();
            
            String sql3 = "INSERT INTO card VALUES ('" + last_account_id + "', '" + cardNumber + "', '" + code + "')";
            
            stmt3.executeUpdate(sql3);
            
            
            Statement stmt4 = c.createStatement();
            
            String sql4 = "INSERT INTO balance VALUES ('" + cardNumber + "', '0')";
            
            stmt4.executeUpdate(sql4);
            
            
            c.close();
            
            
            System.out.println("Account created successfully");
            
            System.out.println("Card number: " + cardNumber);
            
            System.out.println("Pincode: " + code);
            
            
            return true;
        } catch (Exception e) {
            System.out.println(e);
        }
        
        return false;
    }
    
    /*
    Card number generation
    */
    public String generateCardNumber() {
        Integer length = 8;
        
        String passwordSet = "1234567890";
        
        char[] cardNumber = new char[length];
        
        for (int i = 0; i < length; i++) {
            int rand = (int) (Math.random() * passwordSet.length());
            
            cardNumber[i] = passwordSet.charAt(rand);
        }
        
        return new String(cardNumber);
    }
    
    /*
    Pin code generation
    */
    public String generatePincode() {
        Integer length = 4;
        
        String passwordSet = "1234567890";
        
        char[] cardNumber = new char[length];
        
        for (int i = 0; i < length; i++) {
            int rand = (int) (Math.random() * passwordSet.length());
            
            cardNumber[i] = passwordSet.charAt(rand);
        }
        
        return new String(cardNumber);
    }
        
        
}
public class BasicAtm {
    
    public static boolean isLogin = false;
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Integer option = 0;
        
        Scanner scanner = new Scanner(System.in);
        
        //Displaying the main menu
        while (option == 0) {
            System.out.println("==== SELECT AN OPTION ====");
            System.out.println("1. Create an account");
            System.out.println("2. Sign in\n");
            
            while (option < 1 || option > 2) {
                System.out.println("Type your choice: ");
                
                option = scanner.nextInt();
            }
        }
        
        //Data entry depending on the selected option
        switch(option) {
            case 1: //Creating a new account
                System.out.println("\n\n=== CREATE NEW ACCOUNT ===\n");
                
                System.out.println("Enter first name:");
                
                String firstName = scanner.next().trim();
                
                System.out.println("Enter last name:");
                
                String lastName = scanner.next().trim();
                
                
                Account account = new Account(firstName, lastName);
                
                account.register();
                
                break;
            
            case 2: //Login to an existing account
                System.out.println("\n\n==== SIGN IN ====\n");
                
                System.out.println("Enter your card number: ");
                
                String cardNumber = scanner.next();
                
                System.out.println("Enter your pincode: ");
                
                String pincode = scanner.next();
                
                Operation operation = new Operation(cardNumber, pincode);
                
                //Checking that the user exists
                try {
                    Connection c = Database.connection();
                    
                    Statement stmt4 = c.createStatement();
                    
                    String sql4 = "SELECT * FROM card WHERE card_number = '" + cardNumber + "' AND pincode = '" + pincode + "'";
                    
                    ResultSet rs4 = stmt4.executeQuery(sql4);
                    
                    //Display the menu of the user who is logged in
                    if (rs4.next()) {
                        isLogin = true;
                        
                        System.out.println("\n\n==== LOGIN SUCCESS ====\n");
                        
                        System.out.println("--- Enter an option ---");
                        
                        System.out.println("1. Balance");
                        System.out.println("2. Deposit");
                        System.out.println("3. Send to other person");
                        
                        Integer option_user = 0;
                        
                        while (option_user < 1 || option_user > 3) {
                            System.out.println("\nType your choice: ");
                            
                            option_user = scanner.nextInt();
                        }
                        
                        Integer balance = 0;
                        
                        //Data entry depending on the selected option
                        switch(option_user) {
                            case 1:
                                System.out.println("\n\n==== SHOW BALANCE ====\n");
                                
                                balance = operation.showBalance(cardNumber);
                                
                                System.out.println(balance);
                                
                                break;
                            case 2:
                                System.out.println("\n\n==== MAKE DEPOSIT ====\n");
                                
                                Integer amount = 0;
                                
                                while (amount <= 0) {
                                    System.out.println("Type amount: ");
                                    
                                    amount = scanner.nextInt();
                                }
                                
                                operation.deposit(amount, cardNumber);
                                
                                balance = operation.showBalance(cardNumber);
                                
                                System.out.println("\nCurrent balance is " + balance);
                                
                                break;
                                
                            case 3:
                                System.out.println("\n\n==== SEND MONEY TO OTHER CARD ====\n");
                                
                                System.out.println("Enter number of other client: ");
                                
                                String number_other = scanner.next();
                                
                                Integer amountOther = 0;
                                
                                while (amountOther <= 0) {
                                    System.out.println("Enter amount for other client: ");
                                    
                                    amountOther = scanner.nextInt();
                                }
                                
                                operation.sendMoneyToOther(amountOther, number_other, cardNumber);
                                
                                System.out.println("\nYou've sent " + amountOther + " to " + number_other);
                                
                                break;
                            
                            default:
                                break;
                        }
                        
                    } else {
                        System.out.println("\nLogin fail");
                    }
                } catch (Exception e) {
                    
                }
                break;
                
            default:
               break;
            
            
        }
    }
    
}
public class Database {
    private static final String dbClassName = "com.mysql.cj.jdbc.Driver";
    
    private static final String CONNECTION = "jdbc:mysql://localhost:3306/java";
    
    private static final String USER = "root";
    
    private static final String PASSWORD = "password";
    
    public static java.sql.Connection connection() throws Exception {
        Class.forName(dbClassName);
        
        return DriverManager.getConnection(CONNECTION, USER, PASSWORD);
    }
}
public class Operation {
    private String cardNumber;
    
    private String pincode;
    
    private Integer balance;
    
    Operation(String cardNumber, String pincode) {
        this.cardNumber = cardNumber;
        this.pincode = pincode;
    }
    
    /*
    Displaying the balance of the bank card
    */
    public Integer showBalance(String cardNumber) {
        try {
            Connection c = Database.connection();
            
            Statement stmt5 = c.createStatement();
            
            String sql5 = "SELECT * FROM balance WHERE card_number = " + cardNumber;
            
            ResultSet rs5 = stmt5.executeQuery(sql5);
            
            while (rs5.next()) {
                this.balance = rs5.getInt(2);
            }
            
        } catch (Exception e) {
            System.out.println(e);
        }
        
        return this.balance;
    }
    
    
    /*
    Put money on a bank card
    */
    public void deposit(Integer amount, String cardNumber) {
        try {
            Connection c = Database.connection();
            
            Statement stmt6 = c.createStatement();
            
            String sql6 = "UPDATE balance SET balance = balance + '" + amount + "' WHERE card_number = " + cardNumber;
            
            stmt6.executeUpdate(sql6);
        } catch (Exception e) {
            System.out.println(e);
        }
    }
    
    /*
    Transfer money to another user
    */
    public void sendMoneyToOther(Integer amountOther, String numberOther, String cardNumber) {
        try {
            Connection c = Database.connection();
            
            Statement stmt8 = c.createStatement();
            
            String sql8 = "UPDATE balance SET balance = balance + " + amountOther + " WHERE card_number = '" + numberOther + "'";
            
            stmt8.executeUpdate(sql8);
            
            
            Statement stmt9 = c.createStatement();
            
            String sql9 = "UPDATE balance SET balance = balance - " + amountOther + " WHERE card_number = '" + cardNumber + "'";
            
            stmt9.executeUpdate(sql9);
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

Ответы (0 шт):