2013-05-28 62 views
3

我使用Hibernate租赁和每次用户日志我正在将数据库更改为他的用户名(SQLite)。可悲的是,有时数据库不存在,我需要创建它。如何在运行时在Hibernate中创建数据库?

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

通常Hibernete分贝这为我:

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

从头开始创建一个新的'SessionFactory',就像创建初始的''一样吗? – millimoose

+0

session = sessionFactory.withOptions()。tenantIdentifier(“tenancy_id”)。openSession(); < - 但我应该添加这个? – MAGx2

+0

我不认为打开会话时数据库更新会运行。它在您创建'SessionFactory'时运行。在切换数据库时,您必须摆脱旧工厂,并重新创建它。我不知道*在哪里做这件事,因为我不知道你在做什么*现在*。 – millimoose

回答

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); 

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

对于设置UPT配置的选项,看这里。 http://docs.jboss.org/hibernate/orm/3.3/api/org/hibernate/cfg/Configuration.html

编辑: 我想这必须添加的是,它被认为是不好的做法,让Hibernate在生产环境中处理DB /模式/表创建的话。根据需要和可行性,为此可以更好地保存准备好的SQL语句,甚至可以通过数据库管理员进行手动操作。但因为我们都很懒惰,我猜这种情况不会经常发生。 ; d

+0

我可以从hibernate.cfg.xml获取我的类吗?像config.loadAnnotatedClassFromXML()? – MAGx2

+0

是的。只需从这里选择最适合您的方法即可:http://docs.jboss.org/hibernate/orm/3.3/api/org/hibernate/cfg/Configuration.html。你可能想看看addClass()或addFile()。 – Carsten

4

你尝试的价值create代替。

create的值将在sessionFactory创建时创建您的表,并保留它们的完整性。

创造降的值将创建表,然后把它们当您关闭SessionFactory的。

这将是

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

更多infornation herehere
或者有可能是一个dialect problem

+0

问题是数据库是在运行时创建的(我正在使用维护) – MAGx2

3

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

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

相关问题