使用Hibernate在运行时创建数据库?

时间:2011-05-05 13:19:51

标签: java mysql hibernate schema

是否可以在运行时使用Hibernate创建一个新数据库(使用模型对象的注释作为模式,来自我们定义的普通模式文件),然后获取连接到该数据库以便可以使用它?

我们想要做的是,当某个动作发生时(例如创建一个新用户),我们为该用户创建一个新的数据库(来自定义的注释或只是一个静态模式),然后有一个处理该数据库,以便用户可以写入它。

用户的事情仅仅是为了说明这个概念......

谢谢!

4 个答案:

答案 0 :(得分:6)

在高层,你要做的就是做到这一点:

  1. 当触发事件发生时,执行DDL以通过JDBC连接创建新数据库 - 在构建时hbm2ddl生成此模式可能最有意义。

  2. 为此数据库构建新的DataSource,并从SessionFactory

  3. 构建新的DataSource
  4. 然后应将此SessionFactory注入(或查找)应用程序的数据访问层,以便为用户找到合适的SessionFactory

    < / LI>

    简而言之,答案是为每个连接/数据库动态构建SessionFactory个实例,并确保您的数据访问层知道如何为条件找到合适的SessionFactory

答案 1 :(得分:1)

同意亚光b,但你确定做这样的事情是个好主意吗?

我猜你有不同的客户,并希望将每个人的数据存储在一个单独的数据库中(或类似的东西)。 为什么不将所有客户数据存储在同一个数据库中,并按客户ID过滤这些数据?

答案 2 :(得分:1)

我之前在我的公司里进行了一次讨论,他们正在讨论弹簧对此的支持。

您可能感兴趣的一些事情: http://blog.springsource.com/2007/01/23/dynamic-datasource-routing/ http://static.springsource.org/spring/docs/3.0.x/javadoc-api/index.html?org/springframework/aop/target/HotSwappableTargetSource.html

AbstractRoutingDataSource对您的案例似乎很有意思。有人还说这可能会禁用第二个hibernate缓存,以确认......

答案 3 :(得分:1)

我回来的时间有点晚,但如果你打算建立一个多租户SAAS应用程序,正如你所说,你也可以使用像客户ID这样的密钥分离。

在休眠状态下,过滤器可以帮助您实现这一目标......

请参阅: http://www.lunatech-research.com/archives/2011/03/04/play-framework-writing-multitenancy-application-hibernate-filters

这是一个播放框架的链接,但它使用了hibernate,所以你可以用经典的Java EE做的几乎一样......