Создание и удаление таблицы вручную в Hibernate с помощью sql-запросов

Необходимо вручную создать и удалить таблицу в бд с помощью sql-запросов, используя Hibernate. Класс-сущность, на основе которого строится таблица:

public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "name")
private String name;

@Column(name = "lastName")
private String lastName;

@Column(name = "age")
private Byte age;

//constructors, getters and setters

}

Настройка конфигурации Hibernate происходит в следующем утилитном классе:

public class Util {

private static final String DRIVER = "com.mysql.cj.jdbc.Driver";
private static final String URL =
        "jdbc:mysql://localhost:3306/usersdb?autoReconnect=true&useSSL=false";
private static final String USERNAME = "root";
private static final String PASSWORD = "root";

private static SessionFactory sessionFactory;

public SessionFactory getSessionFactory() {
    if (sessionFactory == null) {
        try {
            Configuration configuration = new Configuration();
            Properties settings = new Properties();

            settings.put(Environment.DRIVER, DRIVER);
            settings.put(Environment.URL, URL);
            settings.put(Environment.USER, USERNAME);
            settings.put(Environment.PASS, PASSWORD);
            settings.put(Environment.DIALECT, "org.hibernate.dialect.MySQLDialect");
            settings.put(Environment.SHOW_SQL, "true");
            settings.put(Environment.CURRENT_SESSION_CONTEXT_CLASS, "thread");
            settings.put(Environment.HBM2DDL_AUTO, "create-drop");

            configuration.setProperties(settings);
            configuration.addAnnotatedClass(User.class);

            ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
                    .applySettings(configuration.getProperties()).build();

            sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        } catch (Exception e) {
            System.out.println("Problem creating session factory");
            e.printStackTrace();
        }
    }

    return sessionFactory;
}

}

Методы для создания и удаления таблицы:

    public void createUsersTable() {
    Session session = getSessionFactory().openSession();
    Transaction transaction = session.beginTransaction();

    sql = "CREATE TABLE IF NOT EXISTS users " +
            "(id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, " +
            "name VARCHAR(50) NOT NULL, lastName VARCHAR(50) NOT NULL, " +
            "age TINYINT NOT NULL)";

    Query query = session.createSQLQuery(sql).addEntity(User.class);

    transaction.commit();
    session.close();
}

    public void dropUsersTable() {
    Session session = getSessionFactory().openSession();
    Transaction transaction = session.beginTransaction();

    sql = "DROP TABLE IF EXISTS users";

    Query query = session.createSQLQuery(sql).addEntity(User.class);

    transaction.commit();
    session.close();
}

Никак не могу заставить эти методы работать. Таблица создается, но я подозреваю, что это происходит автоматически благодаря конфигурации Hibernate. Возможно, дело в параметре HBM2DDL_AUTO; пробовал менять его значение на update, но это не помогает, просто таблица больше не создается автоматически.

Как заставить методы работать, что я сделал не так?


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

Автор решения: EsReich

Оказалось, забыл обновить запрос: query.executeUpdate(). При каких-то изменениях в таблице запрос следует обновлять, а, скажем, при получении данных из таблицы без её изменения запрос обновлять не нужно. Только сейчас это понял.

→ Ссылка