我正在尝试让我的web应用程序为每个用户使用一个(MySQL)模式。我将Spring与JPA以及Hibernate一起使用。Hibernate多租户概念相关吗?我尝试的方法是
- (a) 每个
HTTPSession
具有一个EntityManagerFactory
- (b) 在登录时设置其中的架构
我已经想好了如何做(b),但我在做(a)时仍然有问题。我试着放@Scope(WebApplicationContext.SCOPE_SESSION)
,但全局EntityManagerFactory
呢?
有什么帮助吗?
您可以实现自己的ConnectionProvider,并在那里进行额外的设置。但我认为,如果您想为每个用户创建一个模式,那么您的应用程序的体系结构会遇到很大的问题。
UPD1
如果你使用弹簧。您可以尝试在会话范围中使用自己的ConnectionProvider impl来声明bean。
但是有一个大问题。Hibernate生成ConnectionProvider。这意味着您必须impl自己的ServiceRegistry(通过Spring工作)并覆盖StandardServiceRegistryBuilder和impl EntityManagerFactoryBuilder(基于EntityManagerFactoryBuilderImpl,但使用StandardServiceRegistryBuilder)。
当创建了新的会话时,它将使用ConnectionProvider来创建连接(可能需要重写一些类)。
确实不建议这样做。。这以后会伤害你,你不能为不同的用户做不同的模式。您始终可以为连接创建自己的属性。。
Configuration cfg = new Configuration();
cfg.configure();
System.setProperty("hibernate.connection.password",pass);
System.setProperty("hibernate.connection.username",usr);
System.setProperty("hibernate.connection.driver_class", driver_class);
System.setProperty("hibernate.connection.url", driver_url);
System.setProperty("hibernate.dialect", dialect);
// etc, etc, for all properties
cfg.setProperties(System.getProperties());
sessionFactory = cfg.buildSessionFactory();
可能是这样的。。但这是错误的!