解决问题的办法都是由具体问题引起的。
先从问题开始,一个实体entity的int 字段score原来默认为0 ,现在想改为默认为100.
第一次解决尝试: 结果:成功
class entity{
private int score
//省略下面的getter和setter方法
}
在new entity()后,score因为是int类型,所以 score=0;
所以在用hibernate的save(entity)之前,entity.setScore(100);
问题虽然解决了,但是这种方式有点侵入式的感觉,而且 save的方法也许有很多处调用,
作为有追求的程序猿,必须得找出更通用的方法。
第二次解决尝试: 结果:失败
我用的是mysql数据库,字段有个default值,即默认值。
然后我设置score的默认值为100。
然并卵, 在new entity()后,score因为是int类型,所以 score=0;
数据库字段默认值不起作用。
然后我想,当给score值传入null时,数据库字段默认值会不会起作用呢?
我就修改了score的声明类型 private Integer score;
这样在new entity()后,score因为是Integer类型,所以 score=null;
结果呢,数据库中score值果然是null,而不是100。
为什么呢?
是因为sql语句问题
INSERT INTO entity (id) VALUES(2) 此条sql语句插入的数据 score=100,起作用了。
INSERT INTO entity (id,score) VALUES(2,null) 此条sql语句插入的数据 score=null
原来是因为hibernate在插入数据时,默认会给所有的字段赋值,即使为null。
最佳解决方案:
折腾了这么多,最终请教同事,出现了让我震撼的终极最佳解决方案。
class entity{
private int score=100;
//省略下面的getter和setter方法
}
简单不简单,是不是最基础的变量声明和初始化赋值问题。
哎,最简单实用的有时候是最好用的!!!!
应该早想到的,就是想给实体的某个字段初始化赋值,java不是提供了初始化赋值语句么!~~~