Java 添加新对象(H2 数据库)

Java add new object (H2 database)

我在向 sql 添加新对象时遇到 ID 问题 table。

我的超级 class 有 name 和 id + 2 个构造函数:

public Car(String name ) {
    this.name = name ;
}

public Car(long id, String name ){
    this.id = id;
    this.name = name ;    
}

Subclass 也有 2 个带 id 和不带 id 的构造函数。

从 H2 我是这样读的:

  public static List<Car> addAllCars() throws SQLException, IOException {
        Connection connection= connectToDatabase();
        List<Car> listOfCars= new ArrayList<>();
        Statement stmt = connection.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT * FROM CARS");

        while(rs.next()){
            Long id = rs.getLong("id");
            String name= rs.getString("name");
            Integer noOfDoors = rs.getInt("noOfDoors");        
            Car newCar= new Car(name, noOfDoors);
            newCar.setId(id);

            listOfCars.add(newCar);

        }

        closeConnectionToDataBase(connection);

        return listOfCars;

    }

当我添加新车时(用户输入名称和 noOfDoors,我应该得到新的 id)

 Connection connection= Database.connectToDatabase();

        PreparedStatement query=
                veza.prepareStatement("INSERT INTO CAR(name,noOfDoors) VALUES(?,?) ");

        query.setString(1, cars.getName());
        query.setInt(2, cars.getNoOfDoors());
     

        query.executeUpdate();
        
        Database.closeConnectionToDataBase(connection);

问题是我进口了 5 辆汽车。 ID 从 1 到 5。但是当我添加一辆新车时,它从 id 40 开始,并且总是增加 1。如果我导入 10 辆汽车,我会从 40 到 50。如果我删除这 10 辆汽车,它也会从 id 50 继续等等。我以为h2里面的id会自动自增

不要期望主键 ID 是连续的。

认为主键应该是连续的是一种常见的误解。唯一的要求是 PK 应该具有 唯一的 值,因此它可以充当行标识符。

如果值一个一个增长,或者有差距,或者数字是随机的,那都没有关系。只要它们是唯一的,您的应用程序就会运行良好。

数据库引擎通常会为不同的线程缓冲数字段,因此不同的用户在添加新行时不会踩到彼此的脚趾。副作用是您会在 table 中看到未使用值的间隙。同样,这非常不重要。

同样典型的是序列中的数字不会被回收。您稍后可以删除行,但这些行的标识符号不会再次分配给新行。同样,这意味着您的 table 的行号中可能会出现间隙,这 非常 不重要。