假设原来没有使用hibernate的情况下,在一个设备管理系统,每个设备都有一个所属的部门。在设备记录表中都是用部门编号来替代。有一张专门的部门表,里面包含部门编号和部门名称。请问:1,在页面中,要是显示设备详情的话,是不是每个设备的部门编号都要去数据库查一下部门表?(因为设备表中只有部门编号没有部门名称, 要显示部门名称)。这样如果很多条记录的话,有没有什么优化的方法呢?2,使用hibernate的话,来设计面向对象的数据库,表结构之类的是否需要改变呢?做映射的时候,设备表中是不是添加一个部门表的外键,也就是部门编号就OK了?用到时再去部门表中查询部门名称?

解决方案 »

  1.   

    原来的表结构是:
     设备表: 设备编号 设备名称 部门编号
     部门表: 部门编号 部门名称用SSH结构写的话,往页面传递的设备list中,是部门编号还是部门名称啊?感觉应该是部门编号。那就是要在页面中再查询?会不会显得高耦合啊?
      

  2.   

    表设计的就有问题
    应该是设备表、部门表、设备部门中间表假如按你的结构来做的话,直接把部门对象传递过去,在设备表中建立Many-to-one的关系,并把它映射为DepID,这样在保存时,直接就把编号DepID保存了
      

  3.   

    额,这样效率不就更差了?只是需要一个部门名称,把部门对象都传过来了...使用hibernate的话,表设计一定要中间表么?
    那因为一个设备只属于一个部门,是不是不需要中间表啊?
      

  4.   

    你这个一对多的关系嘛,lazy=false 直接查部门的时候就把部门对象也查出来了,你有分页的话加个 batch-size=每页的条数,只会产生2条sql语句,所以对性能影响不大。如果访问量大的话,必要的冗余还是需要的。
      

  5.   

    不是,可能是我的表达有问题,我的意思主要是想问。原来采用的是struts+velocity+jdbc,数据库设计:
    设备表: 设备编号 设备名称 部门编号
    部门表: 部门编号 部门名称 为了显示设备的详细信息,原来的做法是,传递到页面上:list<设备>,设备包含设备编号,设备名称,部门编号。然后在页面上调用方法(这是一个提取出来的共通方法,因为类似情况很多),根据部门编号查询部门名称并显示出来的。PS:共同方法: return:目标字段的值(部门名称的具体值)
                   arguments: 表名(部门表),目标字段(部门名称),参数字段(部门编号),
                               参数值(部门编号的具体值)现在改用SSH架构时,传递到页面什么内容,是否还是在页面查询
      

  6.   

    首先没必要改变表的结构。只要改变查询方式。具体的说就是hql的写法。下面的hql:select 设备编号, 设备名称, 部门名称 from 设备 left join fetch 设备.部门也会返回一个list。只不过这个list的成员不是设备对象,而是一个有设备编号, 设备名称, 部门名称的对象数组。至于怎么在页面上处理这个数组就要看楼主struts的功力了。如果楼主感觉在页面上处理对象数组不如处理单个对象来的方便,可以用下面的技巧:select new 设备部门(设备编号, 设备名称, 部门名称) from 设备 left join fetch 设备.部门其中设备部门是一个所谓的数据转换类。具体做法楼主可查阅相关hibernate资料
      

  7.   


    棒棒 另外如果有特殊查询的话 我建议LZ用@Formula(XML配置文件的方式我忘了)
    具体LZ可以搜索下这个 当只需要查询一个属性而不需要查询整个实体的时候 这个东西还是比较有用的
      

  8.   

    不需要改变表结构的  hibernate本来就是轻量级的框架改变一下查询的语句就开源了 参考 6楼的
      

  9.   

    使用many-to-one并配置lazy="false"
    在查询设备的时候会将部门也查询出来
    将部门对象set到设备javabean中