Hibernate的持久化类使用的是JavaBean的风格为要被访问的属性提供了一套get和set方法这两个方法也叫做持久化类的访问方法记得曾经在接触JavaBean的时候我很迷糊总觉得提供这两个方法倒不如把Bean的属性设置public然后直接调用对象属性这样来的方便但是后来有一个这样的需求就是一个人名字可以被查看但是不可以修改这个时候如果用set方法的话只需要把set方法的修饰符换为private就OK了如果是用对象属性的形式调用就麻烦了而且最重要的一个有点是JavaBean的风格可以简化Hibernate通过JAVA反射机制来获得持久化类的访问方法的过程至于JAVA的反射机制我也是了解一些皮毛据说很深奥有兴趣的朋友可以Google一下有一点值得注意就是JAVA应用程序不能访问JavaBean持久化类的private类型的getset方法而Hibernate没有这个限制可以访问所有的级别包括private defaultprotectedpublic
Java有种基本类型:byteshortcharintlongfloatdoubleboolean还有种与之对应的包装类型ByteShortCharacterIntegerLongFloatDoubleBoolean包装类型就是把基本类型包装成对象的意思基本类型于包装类型之间可以方便的转换例如:
int i = ;
Integer ie = new Integer(i);//基本类型转换成包装类型
i = ieintValue();//包装类型转化成基本类型
注意直接转换也是可以的例如i = ie; JAVA会自动把包装类型转换成基本类型或者ie = i; JAVA会自动把基本类型转换成包装类型在持久化类中既可以把属性定义为基本类型也可以定义为包装类型他们对应的Hibernate映射类型int和Integer都对应int类型这个表示不是很明显在用JAVA对象类型字符串举例String数据库是varhcar()在hibernate的*hbmxml映射文件里一律写为string其实使用基本类型或者包装类型来定义持久化类中的属性是各有优缺点的基本类型就是使用方便简单在需要数字运算的时候直接可以运算而包装类型就要麻烦的先转换成基本类型然后在进行运算但是包装类型的优点在于能表达null值每一个包装类型的对象创建的时候默认值都是null类型的而基本类型是不可以表达null的它们的默认值是为什么要表达null值呢因为SQL中所有类型的数据默认值都是null的当进入insert的时候没有复值的属性默认值就是null所以说JAVA的包装类型和数据库之间的对应关系更直接这里建议Hibernate的OID设置为包装类型其他的属性就根据业务需要和个人习惯来定吧
Hibernate在初始化阶段会根据映射文件的信息为所有的持久化类预定义insert语句update语句where IDdelete语句where IDselect语句where ID这里所说的语句就是标准的SQL增删改查语句参数用?代表JDBC PreparedStatement中的参数这里就不举例了这些SQL语句都存放在SessionFactory的缓存中当执行Session的save()update()delete()load()方法时将会从SessionFactory的缓存中读取这些预定义的SQL语句在把具体的参数值绑定到SQL语句中这就是Hibernate的基本原理在默认的情况下这些语句表达的是所有的字段当然Hibernate还允许我们在映射文件里控制insert和update语句的内容比如在映射文件中<property 元素中的update属性设置成为false那么这个字段将不被包括在基本的update语句中修改的时候将不包括这个字段了insert同理dynamic动态SQL语句的配置也是很常用的下面介绍配置SQL语句的具体属性:
)<property>元素 insert属性:设置为false在insert语句中不包含这个字段表示永远不会被插入默认true
)<property>元素 update属性:设置为false在update语句中不包含这个字段表示永远不会被修改默认true
)<class>元素 mutable属性:设置为false就是把所有的<property>元素的update属性设置为了false说明这个对象不会被更新默认true
)<property>元素 dynamicinsert属性:设置为true表示insert对象的时候生成动态的insert语句如果这个字段的值是null就不会加入到insert语句当中默认false
)<property>元素 dynamicupdate属性设置为true表示update对象的时候生成动态的update语句如果这个字段的值是null就不会被加入到update语句中默认false
)<class>元素 dynamicinsert属性:设置为true表示把所有的<property>元素的dynamicinsert属性设置为true默认false
)<class>元素 dynamicupdate属性:设置为true表示把所有的<property>元素的dynamicupdate属性设置为true默认false
Hibernate生成动态SQL语句的消耗的系统资源(比如CPU内存等)是很小的所以不会影响到系统的性能如果表中包含N多字段建议把dynamicupdate属性和insert属性设置为true这样在插入和修改数据的时候语句中只包括要插入或者修改的字段可以节省SQL语句的执行时间提高程序的运行效率