我正在尝试为 Spring/Hibernate 应用程序找出一个好的设计。在创建这样的应用程序时,似乎有一些重大决策。
第一个主要决定似乎是在哪里放置 session /事务边界。似乎我有 3 个主要选择:作为甚至调用 Controller 之前的过滤器,在服务调用级别的 Controller 下方,以及在存储库调用中的业务级别下方的填充方式。
在我看来,正确的选择是中间道路,但我不确定。我不希望我的事务打开时间过长,但同时,我也不希望经常担心分离对象和业务逻辑中的延迟加载。不过,也有一些缺点。例如,业务逻辑很难在不暂停事务几秒钟的情况下进行远程调用。我想知道有没有更好的方法?
最佳答案
解决方案 1:在 View 过滤器中打开 session
方案二:业务层的事务边界
解决方案 3:dao 层的事务边界
除非您的 dao 方法包含业务逻辑,否则将事务限制为 dao 调用是没有意义的。我认为这是接近“自动提交”模式有用的方式。
在任何情况下,如果您希望保持事务简短,我建议您密切关注每个业务用例的“sql 足迹”(通过将 org.hibernate.SQL 日志类别设置为 DEBUG)并将生成的 sql 与什么进行比较你会自己写的。
大多数时候我看到缓慢的用例,这是因为没有正确配置 hibernate 延迟加载功能(它要么太急,在每个查询中添加 12 级连接,要么太懒,按集合元素发出查询)
关于hibernate - 在 Spring/Hibernate 堆栈中打开 session 的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2863587/