用于打开和关闭hibernate会话的模式(MyFaces 2.2.2 + Spring 4.0.3 + Hibernate 4.3.2)

时间:2014-04-17 07:55:23

标签: java spring hibernate myfaces jsf-2.2

我正在创建一个新项目,我对spring + hibernate管理有一些疑问。首先,我想说我已经阅读了很多内容,并且我试图记录自己,但几周之后我仍然对此话题感到有点迷失。

项目配置

  • 我的架构遵循以下结构:

    JSF Beans - >外立面层 - >服务层 - > DAO层

  • 我的hibernate处理所有DAOS并与Spring完全集成。

  • 整个Datasource和Hibernate配置在Spring配置文件中完成,因此spring管理所有内容。
  • 我使用Spring Security来处理项目安全性。

一切似乎都很好地集成了,但我仍然无法找到一个可靠的解决方案来管理Hibernate Sessions。

我的第一种方法是使用JSF PhaseListeners来使用OSIV,但后来我集成了Spring并开始在我的服务层使用@Transactional注释。

以下是我的问题:

  • 我想每次调用@Transactional方法时都会打开并关闭Hibernate会话吗?或者我错了?

  • 使用@Transactional我肯定会因为Hibernate在Render响应阶段的Lazy实例化而遇到麻烦,而且我不想进行EAGER提取。所以......

  • 使用OSIV是否安全?或者它是否真的容易受到DOS攻击?

  • 有没有比OSIV模式更好的方法来处理Lazy抓取问题?我相信我错过了更好的模式,你能否对这个主题有所启发?

我没有发布任何代码,因为我的所有问题基本上都是关于架构的概念,但是如果你需要我的任何代码来理解我(我知道我是一个解释自己的混乱),你只需要问我和我我会尽快发布它。

谢谢大家!

1 个答案:

答案 0 :(得分:1)

这是很多问题,我不希望任何人一次完全回答所有这些问题。我会在问题1和2上尽我所能:

1)当在bean上调用带有@Transactional的方法时(即不直接在同一个类中),Spring会检查现有的事务并执行某些操作。这些内容由您的配置设置(并且可能针对方法或bean进行不同配置),请参阅Transaction Propagation。所以你可以使用现有的,或者根本不使用交易。

2)我发现非热切的提取是我项目中的一个问题。这当然是可能的,但恕我直言,它很难维护,并为错误增加了额外的空间。之前已经讨论过这个问题(可能会再次回答:可能,但需要额外的工作,你应该根据具体情况权衡效益):Open Session In View Pattern