状况:
目前我设计的数据库结构之间关联有点儿复杂,导致我获取一条数据库记录所映射的持久化业务模型对象实例居然要执行好多条sql语句来加载他们之间的关联,效率比较差,而且整个程序中我并不是所有地方都需要他加载关联。
问题:
1.hibernate有没有无视配置文件中关联部分的配置的查询方法(只查数据,不加载所有关联)??
2.在struts2的action中的execute中打开hibernate的session和transaction执行操作,并把session/transaction存入request转向jsp,在jsp中取出session和transaction进行事务的提交和关闭,这种方法可取么?会不会造成代码有可能执行不到最终的closeSession的部分的情况而导致session未关闭?????(我是想通过懒加载解决这个问题)。
3.还有什么更好的方法可以解决这个问题??(整个应用中有时不需要任何关联的加载)

解决方案 »

  1.   

    对于问题一是不是可以将many-to-many的lazy属性设置为true来解决?
      

  2.   

    回1楼,如果我设置了懒加载,那么可能要跳到渲染层完成渲染后才能提交事务关闭session呢,会不会造成有可能session关闭执行不到??
      

  3.   

    execute中最好不要放业务逻辑,关于SESSION关闭你可以设置SESSION池来解决这个问题。关键是看你的业务需要了
      

  4.   

    感觉Hibernate在解耦和少写代码的好处之外也带来了不少不灵活的地方。
    或许真的越封装越集成,灵活性就越差,就越只能适用于特定环境??
    -------------------------------------
    我打算在dao层获取到对象后手动加载所需的关联,并在dao层完成资源的释放,不把这些工作丢给其他地方
    hibernate是不是通常提倡我们使用懒加载??
      

  5.   

    楼上说啥?在视图层打开session完成全部与持久层的交互??
      

  6.   

    1.设置lazy = true 需要关联的时候,自己在session关闭前获取,不需要则不取。
    2.如果有1对多,在多的那方设置inverse = true
    3.事务在你完成所有操作的时候提交,session在所有请求或事务完成后close,finally执行。
      

  7.   

    open session in view是把双刃剑。最终看你的应用系统需求而定。
    反正open session in view这个东西,有支持的,有反对的。
      

  8.   

    刚刚google了一下,粗略了解了一下“open session in view”
    我看我还是选择open session in dao吧有需要就get一下,list一下。
    谢谢各位了!!