-
问题
我们在数据库建表的是时候,经常有下面类似的语句:
`name` varchar(50) NOT NULL DEFAULT '' COMMENT '视频所属用户',
意思是name这个String类型字段不能为空,但是可以用空字符串填充。
这个默认值并不是万能的。
假如name属于Task这个Javabean,不给name初始化(即name为null),jpa或者hibernate使用
taskDao.saveAndFlush(task);
的时候还是会收到SQLException,Exception内容是column name 不能为null。
2.原因
MySQL只能为缺省的字段使用默认值,传入了字段又为null则不能使用默认值。下面有两条SQL语句。
第一条:
insert into task (id, name) values (1001, null);
这条SQL语句执行就会报错。
第二条:
insert into task (id) values (1001);
这条SQL语句则会执行成功,name为空字符串。
taskDao.saveAndFlush(task);
这种用法就相当于第一条SQL语句。
3. 解决办法
要想MySQL帮你使用默认值,你就不要传那个字段;但是jpa或者hibernate保存JavaBean时,JavaBean中的属性要么有值,要么为null,不符合MySQl的要求。这时可以使用BeanUtil为JavaBean的null属性填充空字符串、0、当前时间等等符合你要求的默认值。