如何在运行时在 Hibernate 中创建数据库?

Posted

技术标签:

【中文标题】如何在运行时在 Hibernate 中创建数据库?【英文标题】:How to create database in Hibernate at runtime? 【发布时间】:2013-05-24 00:11:47 【问题描述】:

我正在使用 Hibernate 租赁,每次用户登录时,我都会将数据库更改为他的用户名 (SQLite)。遗憾的是,有时数据库不存在,我需要创建它。

问题是我不知道如何在运行时在数据库中创建所有表。

通常 Hibernete 用这个为我创建数据库:

<property name="hibernate.hbm2ddl.auto">update</property>

【问题讨论】:

从头开始创建一个新的SessionFactory,就像创建初始的一样? session = sessionFactory.withOptions().tenantIdentifier("tenancy_id").openSession(); 我认为打开会话时不会运行数据库更新。它在您创建 SessionFactory 时运行。切换数据库时,您必须摆脱旧工厂,重新创建它。我不知道在哪里这样做,因为我不知道你在哪里做现在 希望对您有所帮助。这个对我有用。 ***.com/questions/21069687/… 【参考方案1】:

您可以在运行时通过在 DB 连接 URL 中添加 createDatabaseIfNotExist=true 参数来创建数据库。

欲了解更多信息,请查看SO Link!

【讨论】:

【参考方案2】:

您可以为此使用 SchemaExport 来导出要在创建数据库后立即在新创建的数据库中创建的实体。基本步骤如下。如何获取配置的属性并不重要。

    Configuration config = new Configuration();
    config.addAnnotatedClass(Class1.class);
    config.addAnnotatedClass(Class2.class);
    config.addAnnotatedClass(Class3.class);
    <set all hibernate properties/datasource here>
    SchemaExport schema = new SchemaExport(config);
    schema.create(true, true);

Javadocs 在这里:http://docs.jboss.org/hibernate/orm/3.3/api/org/hibernate/tool/hbm2ddl/SchemaExport.html

有关设置配置的选项,请查看此处。 http://docs.jboss.org/hibernate/orm/3.3/api/org/hibernate/cfg/Configuration.html

编辑: 我想必须添加的一句话是,让 hibernate 在生产环境中处理 DB/SCHEMA/TABLE 创建被认为是不好的做法。根据需要和可行性,为此保存准备好的 SQL 语句可能是更好的做法,或者甚至由数据库管理员手动执行。但由于我们都很懒惰,我想这不会经常发生。 ;D

【讨论】:

我可以从 hibernate.cfg.xml 获取我的课程吗?像 config.loadAnnotatedClassFromXML() 一样吗? 是的。只需从这里选择最适合您的方法:docs.jboss.org/hibernate/orm/3.3/api/org/hibernate/cfg/…。您可能想查看 addClass() 或 addFile()。【参考方案3】:

您是否尝试使用值 create

create 值将在 sessionFactory 创建时创建您的表,并保持它们不变。

create-drop 的值将创建您的表,然后在您关闭 sessionFactory 时删除它们。

那就是

<property name="hibernate.hbm2ddl.auto">create</property>

更多信息here和here 或者可能有一个dialect problem

【讨论】:

问题是数据库是在运行时创建的(我用的是tenance)

以上是关于如何在运行时在 Hibernate 中创建数据库?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 IntelliJ 和 H2 中创建 Hibernate 映射

如何在拖动项目时在Extjs中创建占位符

Cordova / Ionic 在每次运行时在 config.xml 中创建 <allow-navigation> 垃圾

如何在插入时在 SQL Server 中创建触发器?

Laravel 不会在刷新时在“迁移”表中创建记录

如何在android中创建SQLite数据库