元素的not-null属性 
如果元素的not-null属性为true,表明不允许为null,默认为false。例如以下代码表明不允许Customer类的name属性为null: 
<property name="name" column="NAME" 
type="string" not-null="true" /> 
Hibernate在持久化一个Customer对象时,会先检查它的name属性是否为null,如果为null,就会抛出以下异常: 
net.sf.hibernate.PropertyValueException: 
not-null property references 
a null or transient value: 
mypack.Customer.name 
如果数据库中CUSTOMERS表的NAME字段不允许为null,但在映射文件中没有设置not-null属性: 
<property name="name" column="NAME" 
type="string" /> 
那么Hibernate在持久化一个Customer对象时,不会先检查它的name属性是否为null,而是直接通过JDBC API向CUSTOMERS表插入相应的数据,由于CUSTOMERS表的NAME字段设置了not null约束,因此数据库会抛出错误: 
708 ERROR JDBCExceptionReporter: 
58 - General error, message from server: 
"Column 'NAME' cannot be null" 
值得注意的是,对于实际Java应用,当持久化一个Java对象时,不应该依赖Hibernate或数据库来负责数据验证。在四层应用结构中,应该由表述层或者业务逻辑层负责数据验证。例如对于Customer对象的name属性,事实上在表述层就能检查name属性是否为null,假如表述层、业务逻辑层和Hibernate持久化层都没有检查name属性是否为null,那么数据库层会监测到NAME字段违反了数据完整性约束,从而抛出异常,如图2-2所示,包含非法数据的Customer对象从表述层依次传到数据库层,随后从数据库层抛出的错误信息又依次传到表述层,这种做法显然会降低数据验证的效率。 

解决方案 »

  1.   

    “值得注意的是,对于实际Java应用,当持久化一个Java对象时,不应该依赖Hibernate或数据库来负责数据验证。在四层应用结构中,应该由表述层或者业务逻辑层负责数据验证。”有这句就够了
      

  2.   

    兄弟门。你们的回答都不靠谱啊。
    ---------------
    我的问题是。为什么在我读取VtmcVehAlarmsusp这张表的时候。
    报错信息却是VtmcVehAlarm.gcjlxh为空的错误呢?也就是说在我读取VtmcVehAlarmsusp这个表的时候。hibernate内部调用了读取VtmcVehAlarm的操作。我就是想知道为什么会有这样的操作?什么时候有这样的操作?
    现在我说的够明白了把。
      

  3.   

    你的数据库的该字段的值是null的 肯定会有问题
      

  4.   

    VtmcVehAlarmsusp是不是有一个属性是VtmcVehAlarm类型的这种情况下
    如果不延迟加载的话 查询VtmcVehAlarmsusp时,肯定会把它的这个属性查出来
      

  5.   

    没有。
    不过他其中一个属性是联合主键。
    主键中的一个是VtmcVehAlarm的主键。
    但是这个对应关系没有在程序中。或xml中表现出来。数据库中也没设置外键。
      

  6.   

    你的检索策略此时是立即检索;
    如果你不设置lazy=true,hibernate里默认的策略是立即检索的
    在读取表的时候,会把与其级联的其他表也一同读入缓存的
      

  7.   

    <class name="com.htits.vtmp.db.pojo.VtmcVehAlarmsusp" table="VTMC_VEH_ALARMSUSP">
            <composite-id name="id" class="com.htits.vtmp.db.pojo.VtmcVehAlarmsuspId">
                <key-property name="bjxh" type="string">
                    <column name="BJXH" length="22" />
                </key-property>
                <key-property name="bkxh" type="string">
                    <column name="BKXH" length="22" />
                </key-property>
            </composite-id>
            <property name="qrzt" type="string">
                <column name="QRZT" length="2"  />
            </property>        
        </class>
    ------------------------------------------------------
    都说了。在程序中和xml都没有表现她们之间的关联。
      

  8.   

    把联合主键去了,试一下还有你在VtmcVehAlarm中有没有配与VtmcVehAlarmsusp的关系
      

  9.   

    估计你的表里面有脏的数据,把表数据清空再添加然后去Query试试
      

  10.   

    估计你的表里面有脏的数据,把表数据清空再添加然后去Query试试