有三个实体:用户、单位和角色,使用hibernate的建立关联关系,单位和用户一对多,用户和角色是一对多;用户实体里及时加载他所属单位和拥有的角色;创建修改用户信息时,用户及时加载单位和角色,方便操作;用户登录时,及时加载单位和角色方便于权限控制;但是存在一个问题,就是其他开发人员需要获取用户列表时(只需要查询用户信息),也及时加载单位和角色信息,肯定影响效率,怎么办,您能不能帮我分析一下啊?先谢谢啦!

解决方案 »

  1.   

    User.java@ManyToOne
    Department depart;
    @OneToMany
    Set<Role> roles;都设置为lazy加载1、创建修改用户信息时,用户及时加载单位和角色
     1.1 创建用户信息时,肯定是没有单位的和角色的,因此实际上对于单位和角色是需要分别单独select
     1.2 修改用户信息时,也只是把User中的depart和roles拿出来,这里你使用延迟还是立即都没多大影响。延迟的话,对于User是一个select 对于user.depart也是一个select对于user.roels这个多少要看你的批量查询的设置是多少了,你只需要设置@BatchSize(size = 20)的大小就可以,这个根据你系统的一个用户最大有多少个角色配置就行了,那么如果配置合理的话也是一个select;如果是理解加载的话,其实是一样的。为什么?lazy只不是是在要用的时候采取查询,如果永远不使用user.depart那么这个查询depart的select就会省略,而立即是管你用不用都给你select出来。
    2、用户登录时,及时加载单位和角色方便于权限控制
      这个就不解释了,跟1.2一样。3、其他开发人员需要获取用户列表时(只需要查询用户信息)
    由于你的主查询表设置为user并将其中的关联对象的获取配置为lazy那么你就没必要操心这个问题。只要在你查询的User对象中,你不使用user.depart或者user.roels,那么查询depart的select和查询roels的select就不会执行。所以么……
      

  2.   

    oxcow,你好!
    org.hibernate.LazyInitializationException: could not initialize proxy - no Session。我按照你说的将及时加载配置成延迟加载,当使用user.roles和user.company时报出上面异常!
      

  3.   


    你可以看下http://hi.baidu.com/362217990/blog/item/4c4aabee2b9cf5e6ce1b3ea4.html