Спящий режим сохраняет некоторые таблицы с помощью hbm2ddl.auto =update, перезагружает некоторые таблицы с помощью hbm2ddl.auto= create

#java #mysql #hibernate #hbm2ddl

#java #mysql #спящий режим #hbm2ddl

Вопрос:

🙂

Как следует из названия, я хотел бы спросить вас, можно ли в hibernate 5.2.2 использовать hbm2ddl.auto=update для одних таблиц при использовании hbm2ddl.auto=create для других. Или лучше, могу ли я конкретно определить в коде, что теперь я хочу создавать новые таблицы, а в другой раз я хочу только обновить?

Пример HibernateConnector, как я хотел бы, чтобы он функционировал:

 public class HibernateConnector {

private static HibernateConnector me;
private Configuration cfg;
private SessionFactory sessionFactory;


private HibernateConnector(boolean db) throws HibernateException {
    if (db) {
        cfg = new Configuration();
        cfg.addAnnotatedClass(A.class);
        cfg.addAnnotatedClass(B.class);

        cfg.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
        cfg.setProperty("hibernate.connection.url", "jdbc:mysql:XXX");
        cfg.setProperty("hibernate.connection.username", "XXX");
        cfg.setProperty("hibernate.connection.password", "XYZ");
        cfg.setProperty("hibernate.show_sql", "true");
        cfg.setProperty("hibernate.hbm2ddl.auto", "create");
        sessionFactory = cfg.buildSessionFactory();
    } else {
        cfg = new Configuration();
        cfg.addAnnotatedClass(A.class);
        cfg.addAnnotatedClass(B.class);
        cfg.addAnnotatedClass(C.class);
        cfg.addAnnotatedClass(D.class);

        cfg.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
        cfg.setProperty("hibernate.connection.url", "jdbc:mysql://XXX");
        cfg.setProperty("hibernate.connection.username", "XYZ");
        cfg.setProperty("hibernate.connection.password", "XXX");
        cfg.setProperty("hibernate.show_sql", "true");
        cfg.setProperty("hibernate.hbm2ddl.auto", "update");
        sessionFactory = cfg.buildSessionFactory();
    }
}

public static synchronized HibernateConnector getInstance() throws HibernateException {
    if (me == null) {
        me = new HibernateConnector(false);
    }
    return me;
}

public static synchronized HibernateConnector getDBInstance() throws HibernateException {
    if (me == null) {
        me = new HibernateConnector(true);
    }
    return me;
}

public Session getSession() throws HibernateException {
    Session session = sessionFactory.openSession();
    if (!session.isConnected()) {
        this.reconnect();
    }
    return session;
}

private void reconnect() throws HibernateException {
    this.sessionFactory = cfg.buildSessionFactory();
}
}
 

Спасибо и хорошего дня 🙂

Ответ №1:

Хорошо, поэтому я решил это именно так, как у меня есть в моем вопросе. Я использую простой логический флаг для выбора между двумя отдельными конфигурациями для HibernateConnector

 private HibernateConnector(boolean db) throws HibernateException {
if (db) {
    cfg = new Configuration();
    cfg.addAnnotatedClass(A.class);
    cfg.addAnnotatedClass(B.class);

    cfg.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
    cfg.setProperty("hibernate.connection.url", "jdbc:mysql:XXX");
    cfg.setProperty("hibernate.connection.username", "XXX");
    cfg.setProperty("hibernate.connection.password", "XYZ");
    cfg.setProperty("hibernate.show_sql", "true");
    cfg.setProperty("hibernate.hbm2ddl.auto", "create");
    sessionFactory = cfg.buildSessionFactory();
} else {
    cfg = new Configuration();
    cfg.addAnnotatedClass(A.class);
    cfg.addAnnotatedClass(B.class);
    cfg.addAnnotatedClass(C.class);
    cfg.addAnnotatedClass(D.class);

    cfg.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
    cfg.setProperty("hibernate.connection.url", "jdbc:mysql://XXX");
    cfg.setProperty("hibernate.connection.username", "XYZ");
    cfg.setProperty("hibernate.connection.password", "XXX");
    cfg.setProperty("hibernate.show_sql", "true");
    cfg.setProperty("hibernate.hbm2ddl.auto", "update");
    sessionFactory = cfg.buildSessionFactory();
}
}
 

Я не совсем уверен, что это лучшее решение, но оно работает.