每个用户一个模式的Web应用程序

时间:2015-02-05 17:07:52

标签: java spring hibernate jpa multi-tenant

我正在尝试让我的Web应用程序为每个用户使用一个( MySQL )架构。 我正在使用 Spring JPA 以及 Hibernate 。 Hibernate Multi-tenancy概念是否相关? 我试图这样做的方式是

  • (a)每EntityManagerFactory
  • 有一个HTTPSession
  • (b)在登录时设置架构。

我已经想出了如何做(b),但我仍然有问题(a)。 我尝试了@Scope(WebApplicationContext.SCOPE_SESSION),但全球EntityManagerFactory

怎么样?

任何帮助?

2 个答案:

答案 0 :(得分:0)

您可以实现自己的ConnectionProvider并进行额外设置。 但是,如果您想为每个用户执行一个模式,我认为您的应用程序架构存在很大问题。

<强> UPD1

如果你使用弹簧。您可以尝试在会话范围中声明具有自己的ConnectionProvider imp的bean。

但是有一个大问题。 Hibernate制作ConnectionProvider。这意味着您必须使用自己的ServiceRegistry(通过Spring工作)并覆盖StandardServiceRegistryBuilder,并使用EntityManagerFactoryBuilder(基于EntityManagerFactoryBuilderImpl,但使用您的StandardServiceRegistryBuilder)。

创建新会话后,它将使用ConnectionProvider创建连接(可能您必须覆盖某些类)。

答案 1 :(得分:0)

这是真的没有建议..这会伤害你以后,你不能为不同的用户做不同的架构。您始终可以为连接创建自己的属性..

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(); 

它可能是那样的......但这是错误的!