private static void createTables() {
    try {
      System.out.println("1");
      Class.forName("org.h2.Driver");
      Connection conn =
          DriverManager.getConnection(
              GlobalVariables.path, GlobalVariables.username, GlobalVariables.password);
      String queryAdmin =
          "CREATE TABLE IF NOT EXISTS ADMIN(ADMINID INT PRIMARY KEY AUTO_INCREMENT, USERNAME VARCHAR(255) UNIQUE , PASSWORD VARCHAR(255))";
      String queryConsumer =
          "CREATE TABLE IF NOT EXISTS CONSUMER(CONSUMERID INT PRIMARY KEY AUTO_INCREMENT,USERNAME VARCHAR(255) UNIQUE , PASSWORD VARCHAR(255) )";
      String queryProducer =
          "CREATE TABLE IF NOT EXISTS PRODUCER(PRODUCERID INT PRIMARY KEY AUTO_INCREMENT,USERNAME VARCHAR(255) UNIQUE , PASSWORD VARCHAR(255) )";
      String queryInventory =
          "CREATE TABLE IF NOT EXISTS INVENTORY(INVENTORYIDID INT PRIMARY KEY AUTO_INCREMENT, PRODUCTIDID INT,IQUANTITY INT, PRODUCERID INT)";
      String queryOrder =
          "CREATE TABLE IF NOT EXISTS ORDERS(ORDERID INT PRIMARY KEY AUTO_INCREMENT, QUANTITY INT, ORDERDATE VARCHAR(255), ORDERSTATUS VARCHAR(255), CONSUMERID INT)";

      Statement stmt = conn.createStatement();
      stmt.execute(queryAdmin);
      stmt.execute(queryConsumer);
      stmt.execute(queryProducer);
      stmt.execute(queryInventory);
      stmt.execute(queryOrder);

      String alterInventory2 =
          "ALTER TABLE INVENTORY ADD FOREIGN KEY(PRODUCERID) REFERENCES PRODUCER(PRODUCERID) ON DELETE CASCADE";
      String alterOrder =
          "ALTER TABLE ORDERS ADD FOREIGN KEY(CONSUMERID) REFERENCES CONSUMER(CONSUMERID) ON DELETE CASCADE";
      stmt.equals(alterInventory2);
      stmt.equals(alterOrder);
    } catch (Exception e) {
      System.out.println(e);
    }
  }
    /** {@inheritDoc} */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
      // performance : on évite method.invoke pour equals & hashCode
      final String methodName = method.getName();
      if (isEqualsMethod(methodName, args)) {
        return statement.equals(args[0]);
      } else if (isHashCodeMethod(methodName, args)) {
        return statement.hashCode();
      } else if (methodName.startsWith("execute")) {
        if (isFirstArgAString(args)) {
          // la méthode est du type executeQuery(String), executeUpdate(String),
          // executeUpdate(String, ...) ou execute(String sql),
          // alors la requête sql est le premier argument (et pas query)
          requestName = (String) args[0];
        }

        // si on n'a pas trouvé la requête, on prend "null"
        requestName = String.valueOf(requestName);

        return doExecute(requestName, statement, method, args);
      } else if ("addBatch".equals(methodName) && isFirstArgAString(args)) {
        // Bien que déconseillée la méthode est addBatch(String),
        // la requête sql est alors le premier argument
        // (elle sera utilisée lors de l'appel à executeBatch())

        // Rq : on ne conserve que la dernière requête de addBatch.
        // Rq : si addBatch(String) est appelée, puis que executeUpdate(String)
        // la requête du batch est correctement ignorée ci-dessus.
        // Rq : si connection.prepareStatement(String).addBatch(String) puis executeUpdate()
        // sont appelées (et pas executeBatch()) alors la requête conservée est
        // faussement celle du batch mais l'application cloche grave.
        requestName = (String) args[0];
      }

      // ce n'est pas une méthode executeXxx du Statement
      return method.invoke(statement, args);
    }