每个用户有一个架构的Web应用程序



我正在尝试让我的web应用程序为每个用户使用一个(MySQL)模式。我将SpringJPA以及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(); 

可能是这样的。。但这是错误的!

最新更新