我们想做的是,在发生某些操作时(例如创建新用户),我们为该用户创建一个新的数据库(从定义的注释或静态模式中),然后拥有该数据库的句柄,以便用户可以向其写入。
注意:这里的“用户”只是用于说明概念...
谢谢!
从高层次上来说,您需要执行以下步骤才能完成这样的操作:
当触发事件发生时,通过JDBC连接执行DDL以创建一个新的数据库-可能最合理的方式是在构建时由hbm2ddl
生成此模式。
为此数据库构造一个新的DataSource
,并从DataSource
构造一个新的SessionFactory
然后应将此SessionFactory
注入(或查找)应用程序的数据访问层,以查找适当的SessionFactory
以获取用户。
简而言之,答案是为每个连接/数据库动态构造SessionFactory
实例,并确保您的数据访问层知道如何查找符合条件的适当的SessionFactory
。
我回来晚了一点,但如果你计划构建一个多租户SAAS应用程序,就像你说的那样,你也可以使用按客户ID分离的方法。
在Hibernate中,过滤器可以帮助你做到这一点...
这是一个Play框架的链接,但它使用了Hibernate,因此您可以使用经典的Java EE工具来完成几乎相同的操作...
同意matt b的观点,但您确定这样做是一个好主意吗?
我猜您有不同的客户,并希望将每个客户的数据存储在单独的数据库中(或类似的方式)。 为什么不将所有客户的数据存储在同一个数据库中,并通过客户ID过滤这些数据呢?
我曾经在公司里听到过一次关于Spring支持此操作的讨论。
以下是一些可能会对您感兴趣的内容: 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缓存,需要确认...