Hibernate持久化映射文件配置说明
在Hibernate项目中,需要对pojo实体对象与对应的数据库表做持久化映射。如下:
数据库表的定义:
CREATE TABLE `experience` (
`id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
`username` CHAR(20) NOT NULL COMMENT '用户名',
`time` VARCHAR(50) NOT NULL COMMENT '工作年限',
`company` VARCHAR(50) NOT NULL COMMENT '工作所在公司名',
`kind` VARCHAR(20) NOT NULL COMMENT '工作种类',
`content` VARCHAR(200) DEFAULT NULL COMMENT '详细描述',
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='求职者工作经验表表'
对应的pojo实体类为:
public class Experience implements Serializable{
/** */
private static final long serialVersionUID = 1284270858555832898L;
private Integer experienceId;
private String username; // CHAR(20) NOT NULL COMMENT '用户名',
private Date time; // VARCHAR(50) NOT NULL COMMENT '工作年限',
private String company; // VARCHAR(50) NOT NULL COMMENT '工作所在公司名',
private String kind; // VARCHAR(20) NOT NULL COMMENT '工作种类',
private String content; // VARCHAR(200) NOT NULL COMMENT '详细描述',
// setter,getter方法省略
}
它们之间的映射文件如下:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="experience">
<class name="com.ssh.model.Experience" table="experience" discriminator-value="experience">
<id name="experienceId" column="id">
<generator class="native" />
</id>
<property name="username" not-null="true" type="string" update="false"/> (1)
<property name="time" type="date" update="false" />
<property name="company" type="string" update="false" />
<property name="kind" type="string" update="false" />
<property name="content" type="string"/>
</class>
</hibernate-mapping>
以(1)处的配置进行说明:
not-null="true"表明属性username不能为空(插入操作时),在对实体类Experience进行持久化操作(插入)之前,Hibernate会对username属性进行检查。如果username为空在进行插入操作时,会报异常(但不会报SQLEexception,因为Hibernate会在执行sql语句之前,根据not-null的配置先进行检查)。而如果not-null="false"话,username为空就会报SQLEexception,因为not-null的值为false,Hibernate的不会对属性username进行检查,而是直接进行sql操作;而表的定义中username字段不能为空,所以会报SQLEexception。
update="false"表明此属性对应的字段(即username字段)在进行更新操作时,不会对此字段进行更新。注意:如果update="false"而且not-null="true",那么在更新操作时,Hibernate会在执行sql语句之前,忽略对username属性是否为空的检查,而是在执行了sql语句之后才会报SQLEexception。而如果update="true"而且not-null="true"时,Hibernate会在执行sql语句之前会先行对属性username是否为空进行检查。
小结:
1.有此可见配置update="true"或者update="false"(默认update="true")对插入操作,不起作用,只对更新操作起作用。
2.如果配置not-null="true"(默认not-null="false")的话,会增加系统开销,使得在执行sql语句之前,Hibernate会对属性是否为空进行检查。