是否可以在运行时使用Hibernate创建一个新数据库(使用模型对象的注释作为模式,或来自我们定义的普通模式文件),然后获取连接到该数据库以便可以使用它?
我们想要做的是,当某个动作发生时(例如创建一个新用户),我们为该用户创建一个新的数据库(来自定义的注释或只是一个静态模式),然后有一个处理该数据库,以便用户可以写入它。
用户的事情仅仅是为了说明这个概念......
谢谢!
答案 0 :(得分:6)
在高层,你要做的就是做到这一点:
当触发事件发生时,执行DDL以通过JDBC连接创建新数据库 - 在构建时hbm2ddl
生成此模式可能最有意义。
为此数据库构建新的DataSource
,并从SessionFactory
DataSource
然后应将此SessionFactory
注入(或查找)应用程序的数据访问层,以便为用户找到合适的SessionFactory
。
简而言之,答案是为每个连接/数据库动态构建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这样的密钥分离。
在休眠状态下,过滤器可以帮助您实现这一目标......
这是一个播放框架的链接,但它使用了hibernate,所以你可以用经典的Java EE做的几乎一样......