java - Hibernate 使用 hbm2ddl.auto=update 保留一些表,使用 hbm2ddl.auto=create 重新加载一些表

标签 java mysql hibernate 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();
}
}

谢谢你,祝你有美好的一天:)

最佳答案

好的,所以我完全按照问题中的方式解决了这个问题。我使用简单的 boolean 标志来决定 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();
}
}

我不完全确定这是最好的解决方案,但它确实有效。

关于java - Hibernate 使用 hbm2ddl.auto=update 保留一些表,使用 hbm2ddl.auto=create 重新加载一些表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40056763/

相关文章:

java - 在 Java 中检查非空

mysql - 根据存储在数据库中的用户定义的计划查找下一次任务应该运行的时间

java - SQL、Hibernate(注解): Unable to remove parent row from table

java - 无法解决方法占位符 fragment 错误

java - 如何确定图表面板上显示的数据量?

java - java 8中从日期字符串到utc long

mysql - 使用带有扭曲的 adbapi 和 scrapy 的 mysql 进行异常处理

mysql - 如何对子表求和?

java - 如何在 hibernate 中比较日期

java - 尝试通过 Hibernate 连接到 Oracle 时出现 java.lang.NoSuchMethodError