我正在创建一个新项目,我对spring + hibernate管理有一些疑问。首先,我想说我已经阅读了很多内容,并且我试图记录自己,但几周之后我仍然对此话题感到有点迷失。
项目配置
我的架构遵循以下结构:
JSF Beans - >外立面层 - >服务层 - > DAO层
我的hibernate处理所有DAOS并与Spring完全集成。
一切似乎都很好地集成了,但我仍然无法找到一个可靠的解决方案来管理Hibernate Sessions。
我的第一种方法是使用JSF PhaseListeners来使用OSIV,但后来我集成了Spring并开始在我的服务层使用@Transactional注释。
以下是我的问题:
我想每次调用@Transactional方法时都会打开并关闭Hibernate会话吗?或者我错了?
使用@Transactional我肯定会因为Hibernate在Render响应阶段的Lazy实例化而遇到麻烦,而且我不想进行EAGER提取。所以......
使用OSIV是否安全?或者它是否真的容易受到DOS攻击?
有没有比OSIV模式更好的方法来处理Lazy抓取问题?我相信我错过了更好的模式,你能否对这个主题有所启发?
我没有发布任何代码,因为我的所有问题基本上都是关于架构的概念,但是如果你需要我的任何代码来理解我(我知道我是一个解释自己的混乱),你只需要问我和我我会尽快发布它。
谢谢大家!
答案 0 :(得分:1)
这是很多问题,我不希望任何人一次完全回答所有这些问题。我会在问题1和2上尽我所能:
1)当在bean上调用带有@Transactional的方法时(即不直接在同一个类中),Spring会检查现有的事务并执行某些操作。这些内容由您的配置设置(并且可能针对方法或bean进行不同配置),请参阅Transaction Propagation。所以你可以使用现有的,或者根本不使用交易。
2)我发现非热切的提取是我项目中的一个问题。这当然是可能的,但恕我直言,它很难维护,并为错误增加了额外的空间。之前已经讨论过这个问题(可能会再次回答:可能,但需要额外的工作,你应该根据具体情况权衡效益):Open Session In View Pattern