首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Hibernate视图如何避免空值

2012-10-25 
Hibernate视图如何处理空值  现象:项目开发中,根据需求会设计一些比较繁琐的视图,但是使用过程中发现一种

Hibernate视图如何处理空值
  现象:项目开发中,根据需求会设计一些比较繁琐的视图,但是使用过程中发现一种奇怪的现象:在SQL语句在数据库中可以查询出正确的结果,但是通过Hibernate查询的结果却为空值;更奇怪的是,HQL查出来的总记录数是正确的,然结果集中却没有对应的数据。
  出现这种现象的原因分析:hibernate 反向工程向导会为视图自动生成一个复合主键, 这个主键是用所有字段加在一起实现的,所以如果其中有一个为空就会报空指针异常。
  解决思路:修改映射的复合型主键,将两张表的主键合起来作为复合型主键,其余字段作为普通值。

  举例说明:

  1、表结构及关系

    (1)结构:
    Maintain_form 表

    Equipment_dictionary 表

    Maintain_equipment表


    (2)关系:Maintain_equipment表中的maintain_id作为外键映射Maintain_form 表;Maintain_equipment表中的dictionary_id作为外键映射Equipment_dictionary 表

  2、视图
    CREATE VIEW maintain_all AS select rand(10) AS rand_id, m.maintain_id AS maintain_id, me.dictionary_id AS dictionary_id  from maintain_form m left join maintain_equipment me on m.maintain_id = me.maintain_id 

    说明:因为:dictionary_id可能为null,所以很多查询结果为空。所以,生成视图后映射文件后做了如下修改:
    (1)dictionary_id 映射的对象提出来作为普通属性。
    (2)符合主键只有:rand_id 和maintain_id;

  3、视图maintain_all的映射文件和javabean

    MaintainAll.hbm.xml



    MaintainAll.java
package com.equipment.po;/** * MaintainAllId generated by MyEclipse - Hibernate Tools */public class MaintainAllId  implements java.io.Serializable {    // Fields    private Double randId;     private MaintainForm maintainForm;    // Constructors    /** default constructor */    public MaintainAllId() {    }    /** * @param maintainForm * @param dictionary */public MaintainAllId(MaintainForm maintainForm) {this.maintainForm = maintainForm;}       // Property accessors  public MaintainForm getMaintainForm() {return maintainForm;}public void setMaintainForm(MaintainForm maintainForm) {this.maintainForm = maintainForm;}public Double getRandId() {return randId;}public void setRandId(Double randId) {this.randId = randId;}   }

热点排行