1. Hibernate配置文件 Customer.xml
<?xml version=”1.0”?>
<!DOCTYPE hibernate-mapping PUBLIC “-//Hibernate/Hebernate Mapping DTD 2.0//EN”
“http”//hibernate.sourceforge.net/hibernate-mapping-2.0.dtd”>
<hibernate-mapping>
<class name=”mypace.Customer” table=”CUSTOMERS”> 对应CUSTOMERS表
<id name=”id” column=”ID” type=”long”> 必须先定义id,再定义property
<generator class=”incrment” /> generator对象唯一识别符生成器
</id>
<property name=”name” column=”NAME” type=”string” not-null=”true” />
<property name=”emial” column=”EMAIL” type=”string” not-null=”true” />
<property name=”password” column=”PASSWORD” type=”string” not-null=”true” />
<property name=”phone” column=”PHONE” type=”int” />
<property name=”address” column=”ADDRESS” type=”string />”
<property name=”sex” column=”SEX” type=”character” />
<property name=”married” column=”IS_MARRIED” type=”boolean” />
<property name=”description” column=”DESCRIPTION” type=”binary” />
<property name=”birthday” column=”BIRTHDAY” type=”date” />
<property name=”registercdTime” column=”REGISTERED” type=”timestamp” />
</class>
</hibernate-mapping>
2. Java类型、Hibernate映射类型及SQL类型之间的对应关系
|
Customer类的属性
|
Java类型
|
Hibernate映射类型
|
CUSTOMERS表的字段
|
SQL类型
|
|
name
|
java.lang.String
|
string
|
NAME
|
VERCHAR(15)
|
|
email
|
java.lang.String
|
string
|
EMAIL
|
VERCHAR(128)
|
|
password
|
java.lang.String
|
string
|
PASSWORD
|
VERCHAR(8)
|
|
phone
|
int
|
int
|
PHONE
|
INT
|
|
address
|
java.lang.String
|
string
|
ADDRESS
|
VERCHAR(255)
|
|
sex
|
char
|
character
|
SEX
|
CHAR(1)
|
|
married
|
boolean
|
boolean
|
IS_MARRIED
|
BIT
|
|
description
|
java.lang.String
|
text
|
DESCRIPTION
|
TEXT
|
|
image
|
byte[]
|
binary
|
IMAGE
|
BLOB
|
|
birthday
|
java.sql.Date
|
date
|
BIRTHDAY
|
DATE
|
|
registeredTime
|
Java.sql.Timestamp
|
timestamp
|
REGISTERED_TIME
|
TIMESTAMP
|
3. 关于not-null 属性与数据验证
如果数据库中CUSTOMERS表的NAME字段不允许为NULL,但在映射文件中没有设置not-null属性:
那么Hibernate在持久化一个Customer对象时,不会先检查它的name属性是否为null,而是直接通过JDBC API向CUSTOMERS表插入相应的数据,由于CUSTOMERS表的NAME字段设置了not null约束,因此数据库会抛出错误
值得注意的是,对于实际Java应用,当持久化一个Java对象时,不应该依赖Hibernate或数据库来负责数据验证。在四层应用结构中,应该由表述层或者业务逻辑层负责数据验证。例如对于Customer对象的name属性,事实上在表述层就能检查name属性是否为null,假如表述层、业务逻辑层和Hibernate持久化层都没有检查name属性是否为null,那么数据库层会检测到NAME字段违反了数据完整性约束,从而抛出异常,包括非法数据的Custonmer对象从表述层依次传到数据库层,随后从数据库层抛出的错误信息又依次传到表述层,这种做法显然会降低数据验证的效率。
既然如此,把<property>元素的not-null属性设为true,有何意义呢?这主要是便于在软件开发和测试阶段能捕获表述层或者业务逻辑层应该处理而未处理的异常,提醒开发人员在表述层或者业务逻辑层中加入必要的数据验证逻辑。