元素的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对象从表述层依次传到数据库层,随后从数据库层抛出的错误信息又依次传到表述层,这种做法显然会降低数据验证的效率。
如果元素的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对象从表述层依次传到数据库层,随后从数据库层抛出的错误信息又依次传到表述层,这种做法显然会降低数据验证的效率。
---------------
我的问题是。为什么在我读取VtmcVehAlarmsusp这张表的时候。
报错信息却是VtmcVehAlarm.gcjlxh为空的错误呢?也就是说在我读取VtmcVehAlarmsusp这个表的时候。hibernate内部调用了读取VtmcVehAlarm的操作。我就是想知道为什么会有这样的操作?什么时候有这样的操作?
现在我说的够明白了把。
如果不延迟加载的话 查询VtmcVehAlarmsusp时,肯定会把它的这个属性查出来
不过他其中一个属性是联合主键。
主键中的一个是VtmcVehAlarm的主键。
但是这个对应关系没有在程序中。或xml中表现出来。数据库中也没设置外键。
如果你不设置lazy=true,hibernate里默认的策略是立即检索的
在读取表的时候,会把与其级联的其他表也一同读入缓存的
<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都没有表现她们之间的关联。