xiaowanggedege 2009-08-13
很多人在java项目开发的时候,在处理数据库时都会用到数据库映射工具--Hibernate,而对Hibernate的配置文件(.hbm文件)都有所接触,但能够适当配置hbm需要相当的积累。或许Hiberntae还存在很多Bug吧,呵呵,还有待改进。
在java的PoJo类与数据库进行映射的时候,有时候数值型数据,如Int,Float,Double等在insert或者Update操作的时候会遇到Null值的情况,这时候会产生Exception信息:
null value was assigned to a property of primitive type setter of
不知道这种情况怎么解决,最笨的办法就是在数据库里写触发器,但是这个太麻烦
不知道能不能在Hibernate的配置文件中设置默认值,上网google了一下,查到以下内容:
Hibernate允许我们在映射文件里控制insert和update语句的内容.比如在映射文件中<property 元素中的update属性设置成为false,那么这个字段,将不被包括在基本的update语句中,修改的时候,将不包括这个字段了.insert同理.dynamic动态SQL语句的配置也是很常用的.下面介绍配置SQL语句的具体属性:
1)<property>元素insert属性:设置为false,在insert语句中不包含这个字段,表示永远不会被插入,默认true
2)<property>元素update属性:设置为false,在update语句中不包含这个字段,表示永远不会被修改,默认true
3)<class>元素mutable属性:设置为false就是把所有的<property>元素的update属性设置为了false,说明这个对象不会被更新,默认true
4)<property>元素dynamic-insert属性:设置为true,表示insert对象的时候,生成动态的insert语句,如果这个字段的值是null就不会加入到insert语句当中.默认false
5)<property>元素dynamic-update属性,设置为true,表示update对象的时候,生成动态的update语句,如果这个字段的值是null就不会被加入到update语句中,默认false
6)<class>元素dynamic-insert属性:设置为true,表示把所有的<property>元素的dynamic-insert属性设置为true,默认false
7)<class>元素 dynamic-update属性:设置为true,表示把所有的<property>元素的dynamic-update属性设置为true,默认falseHibernate生成动态SQL语句的消耗的系统资源(比如CPU,内存等)是很小的,所以不会影响到系统的性能,如果表中包含N多字段,建议把dynamic-update属性和insert属性设置为true,这样在插入和修改数据的时候,语句中只包括要插入或者修改的字段.可以节省SQL语句的执行时间,提高程序的运行效率.
但是我在Property属性中设置了dynamic-insert和dynamic-update,启动tomcat服务器发现编译出错,于是将这段话(dynamic-insert="true" dynamic-update="true")放在了class中(注:这两种配置是不一样的,写在Property属性中表示是对这个字段起作用,而放在class是表示对类的所有字段起作用),配置代码如下:
...
<class name="view" tablename="view" dynamic-insert="true" dynamic-update="true" />
<property name="filed" type="java.lang.Double">
<column name="filed" sql-type="number(1);default 0" >
</column>
</property>
...
而且还要将Pojo的类型改为对应的类包装类型(java.lang.Interger ,java.lang.Double等,或者省略为Interger和Double)
注意,修改了java代码之后,必须得restart tomcat服务,否则运行还是上次的代码
待代码修改完毕之后,启动tomcat,终于正常了。
不过似乎存在一点问题,不管你的sql-type="number(1);default 0"怎么设置默认值,它都是0,希望知道的高手指教一下,呵呵...