0

我有一个一般设计问题,现在困扰了我一段时间。使用Java EE和Hibernate的多个项目的Web应用程序

目标:

  • 创建使用Vaadin为前端
  • 用户必须能够在运行时创建项目的Web应用程序。每个项目都使用相同的(域)模式,但不同的数据
  • 每个项目的数据必须分开(成不同的数据库)
  • 用户可以登录,选择项目,并获得了特定的数据库
  • 不同的用户可以访问同时
  • 应用程序使用Hibernate与注解和编程配置

现状在不同的项目工作

  • 静态的HibernateUtil在很多地方使用(getSessionFactory.getCurrentSession)
  • 的session-per-查看模式与ThreadLocal中的部分实施,以获得当前应用程序实例,通过使用HTTPServletRequestListener打开的会话级(和交易)管理器的工作原理并关闭会话和交易前,浏览请求,没有直接访问视图层
  • 逻辑层后:
    • 在一些地方,当前会话是在其他地方使用静态的HibernateUtil
    • ,通过设置得会话管理器通过构造函数。然后这个会话管理器被传递给DAO以提供数据检索会话
    • 创建项目时,使用Hibernates创建选项来创建数据库(将来可以在创建时切换到静态ddl导入)

问题

正如人们可以想像,存在着各种问题:

  • 静态访问sessionfactory以获取会话不能用于多个项目,因为静态HibernateUtil只能同时携带一个(db)url,所以会话混合
  • 从逻辑层访问SessionManager并不好(需要提供它通过几个构造函数)的不同方法
  • 混合物难看,但目标是要理顺这个

思考

  • 实现依赖injec即使在逻辑层中也能提供正确的DAOFactory。尝试了Guice,但如果实例不是通过Injector创建的,请获取空指针异常(请参阅我的其他问题)。因此它不起作用。

我希望我能在代码中的任何地方注入/使用正确的DAO工厂实例(它有权访问正确的会话/数据库)逻辑层知道哪个当前数据库被加载。所以逻辑层不应该关心会话处理或任何事情。我只是想在任何地方打一个xyDAO.find(id)或类似的调用,它会得到正确的数据库。我也认为,如果只有一个类在逻辑上需要它,那么通过构造函数将SessionManager传递给几个类并不好。

你会采取什么方法来实现所述目标?

我真的很感激,如果有人可以帮忙。如果您需要更多信息,请告诉我,我会提供!

+0

对于[http://programmers.stackexchange.com](http://programmers.stackexchange.com),这可能是一个更好的问题,因为它涉及的设计多于特定的编码问题。 – Kyle 2011-06-15 22:13:34

回答

0

您有困惑的要求和解决方案吗?

数据为每个项目都必须 分离(成不同的数据库)

真的要求你有不同的数据库,或者是它只是数据为每个项目必须分开

如果不同的数据库不是绝对的要求,只需在表中添加一个user_id列,以便您可以为所有用户使用相同的表格,但仍然可以实现此要求。

你可以称这种方法垂直分割数据,而不是水平

好处应该立即显而易见:突然你的解决方案简单得多,这是件好事。

相关问题