繁体   English   中英

使用Java EE和Hibernate的具有多个项目的Web应用程序

[英]Web app with multiple projects using Java EE and Hibernate

我有一个一般的设计问题,现在困扰了一段时间。

目标:

  • 使用Vaadin创建前端的Web应用程序
  • 用户必须能够在运行时创建项目。 每个项目使用相同的(域)模型,但是数据不同
  • 每个项目的数据必须分开(放入不同的数据库中)
  • 用户可以登录,选择项目并访问特定的数据库
  • 不同的用户可以同时处理不同的项目
  • 应用程序使用带有注释和程序配置的Hibernate

现在的情况

  • 静态HibernateUtil在许多地方使用(getSessionFactory.getCurrentSession)
  • 使用ThreadLocal来部分实现按视图会话模式以获取当前的应用程序实例,该实例通过使用HTTPServletRequestListener打开和关闭视图请求之前和之后的会话和事务来充当会话(和事务)管理器
  • 逻辑层,无法直接访问视图层:
    • 在某些部分中,当前会话是通过使用静态HibernateUtil获得的
    • 在其他地方,可以通过构造函数设置会话管理器。 然后将此会话管理器传递给DAO,以提供用于数据检索的会话操作
    • 创建项目时,使用Hibernates create选项创建数据库(将来可以在创建时将其切换为静态ddl导入)

问题

可以想象,存在各种问题:

  • 静态访问sessionfactory以获取会话无法在多个项目中使用,因为静态HibernateUtil只能同时携带一个(db)url,因此会话混合在一​​起
  • 从逻辑层访问SessionManager不好(需要通过多个构造函数提供)
  • 不同方法的混合是很丑陋的,但目标是要纠正这种情况

思想

  • 实现依赖注入,即使在逻辑层中也可以提供正确的DAOFactory。 与Guice一起尝试过,但是如果实例不是通过Injector创建的,则会得到Null Pointer Exception(请参见我的另一个问题)。 因此,它不起作用。

我希望我可以在代码中的任何位置注入/使用正确的DAO Factory实例(可以访问正确的会话/数据库),而无需例如逻辑层知道加载了哪个当前数据库。 因此,逻辑层不应该关心会话处理或其他任何事情。 我只想从任何地方进行xyDAO.find(id)或类似的调用,即可获取正确的数据库。 我还认为,如果只有一个逻辑深层的类需要SessionManager通过构造函数将SessionManager传递给多个类,那就不好了。

您将采取什么方法实现所述目标?

如果有人可以提供帮助,我将不胜感激。 如果您需要其他信息,请告诉我,我会提供!

您是否对要求和解决方案感到困惑?

每个项目的数据必须分开(放入不同的数据库中)

是否真的有要求您拥有不同的数据库,还是仅仅是每个项目的数据都必须分开

如果不是绝对需要不同的数据库,只需将user_id列添加到足够的表中,这样您就可以为所有用户使用相同的表,但仍然可以满足此要求。

您可以将这种方法称为垂直而不是水平划分数据。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM