快速业务通道

Hibernate入门之二 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-18
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对象从表述层依次传到数据库层,随后从数据库层抛出的错误信息又依次传到表述层,这种做法显然会降低数据验证的效率。

Hibernate入门之二 - 编程入门网

图2-2 由数据库层负责数据验证

既然如此,把元素的not-null属性设为true,有何意义呢?这主要是便于在软件开发和测试阶段能捕获表述层或者业务逻辑层应该处理而未处理的异常,提醒开发人员在表述层或者业务逻辑层中加入必要的数据验证逻辑。

4.元素的column属性

元素的column属性指定与类的属性映射的表的字段名。以下代码表明和address属性对应的字段为ADDRESS字段:

<property name="address" column= "ADDRESS" type="string"/>

如果没有设置< property >元素的column属性,Hibernate将直接以类的属性名作为字段名,也就是说,在默认情况下,与Customer类的address属性对应的字段为address字段。

元素还可以包括子元素,它和元素的column属性一样,都可以设定与类的属性映射的表的字段名。以下两种设置方式是等价的:

<property name="address" column= "ADDRESS" type="string"/>

或者:

<property name="address" type="string"> <column name="ADDRESS" /> </property>

Hibernate入门之二(6)

时间:2011-02-28

元素的子元素比column属性提供更多的功能,它可以更加详细地描述表的字段。例如,以下子元素指定CUSTOMERS表中的NAME字段的SQL类型为varchar(15),不允许为null,并且为这个字段建立了索引:

<property name="name" type="string">    <column name="NAME" sql-type="varchar(15)"    not-null="true" index="idx_name" /> </property>

子元素主要和hbm2ddl工具联合使用。当使用hbm2ddl工具来自动生成数据库Schema时,hbm2ddl工具将依据子元素提供的信息来定义表的字段。关于hbm2ddl工具的用法参见本书

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号