最近做的那个权限验证系统,用filter通过session中的用户id级联获取角色,权限,资源操作等等,来判断用户能不能访问指定的页面,现在好不容易把功能实现了,又发现一个问题就是如果一个用户有删除资源的权限,在他做删除操作时要删除的资源所关联的权限正巧在跳到删除页面前的权限过滤器中被持久化了,因为要取出来判断啊,删的时候就完了,因为删除的资源关联的权限对象还处于持久态不能删,后来我又把过滤器改成每次提出来权限资源什么的判断完了之后evict,结果又报错说关联的对象处于游离态,级联时自动save-update又报错,看网上说saveOrUpdate前先meger还是什么重新获取一下要更新的对象,关键是现在的saveOrUpdate是配好的级联关系hibernate自动调用的,不是我写代码控制的,怎么加啊,我TM晕死了....

解决方案 »

  1.   

    如果一项技术阻碍你的想法的实现  那你选择这项技术来实现就是错误的hibernate你如果不掌握得非常熟悉  盲目的使用所带来的负面影响远超过该问题的实现难度
      

  2.   

    遇事不急  看看Hibernate的书和视频 找找有没有解决的办法
      

  3.   

    期待高手来指点我怎么解决,作为一个hibernate只学了4天就结课的小白,我表示蛋扯的很疼..
      

  4.   

    业务逻辑得理清楚才行,你的权限控制最好到页面一级,过滤所有的请求就麻烦了,这样Action中的跳转啥的也会进入你的权限控制逻辑,没有必要
      

  5.   

    没有过滤所有的请求.过滤的就是应该受权限控制的那些请求,没有控制到页面级,因为那样权限不够的话servlet也会执行,应该是权限不够连servlet都访问不到吧.我现在的问题是delete本身就在权限控制的范围内,某用户有delete某资源的权限,但在他向servlet发出delete请求时总会被权限控制过滤器来验证把.从用户的session里取出id-取出角色-取出所有权限-挨个比较哪个权限关联的资源是他访问的资源,操作是他请求的操作,如果匹配上了就放行,全匹配不上就提示无权访问,这样虽然他的请求会被放行,但是请求的资源所关联的权限已经在判断的过程中被取出来持久化了.这样请求到了servlet,真正删除这个资源的时候因为这个资源所关联的权限处于持久化状态,那么删除这个资源时要同时删除权限就会报错,因为不能删除一个正在被持久化的对象.虽然可以在删除权限时重新获取一下再删,但是级联删除权限的操作是hibernate本身控制的,不是我编码控制,因此我没法重新获取.问题就在这.我的逻辑有什么不清楚的么.