前面讲了id元素的使用事项,接着上一节,小博老师继续介绍这个案例。接下来看看generator元素的相关使用方法。
两个元素声明了Event类的其余两个持久属性:date和title。 date属性定义了列属性column,但标题不包括。在没有列属性的情况下,Hibernate使用属性名作为列名。在表结构定义和Event类的定义中我们可以看到title在两者定义的名字是相同的,所以可以省略column属性的定义。但日期属性在Event类中定义为date,在表中的列名是EVENT_DATE,所以需要明确指定column的值。
title映射也缺少一个type属性。在映射文件中声明和使用的type(数据类型)既不是Java数据类型也不是SQL数据库类型,它们是Hibernate定义的映射类型,是在Java和SQL数据类型之间转换的转换器。如果在映射中未指定type属性,则Hibernate将自动尝试使用正确的转换器,方法是使用Java反射来确定已声明属性的Java类型,并为该Java类型使用默认映射类型。
在某些情况下,这种自动检测可能会出现问题,如date属性所示。 Hibernate无法确定type(类型为java.util.Date)是要映射到SQL DATE,TIME或TIMESTAMP数据类型。此时,需要通过type属性指定org.hibernate.type.TimestampType转换类,用以保留完整的日期和时间信息。