再Java的持久化开发中,我们经常用到ORM,ORM的诸多好处就不说了。
其中有个注解@Column,该注解有个属性叫columnDefinition,它后面可以指定一个字符串,比如可以设置某个属性的默认值,比如int default 0或者float default '100.00'。
今天遇到一个问题,要给数据库FLOAT字段的属性(Java中实体的某个属性)设置默认值,数据库中已经设置默认值0,但是插入这个Java实体时(没有对这个属性setxxx),也就是说,应该使用默认值。
但是,实际插入后发现这个FLOAT字段的值为NULL(肯定有引起空指针异常的风险,实际上,前面说的今天遇到的问题,就是空指针异常),为啥不是它的默认值0呢??
于是,既然数据库表格中设置的默认值没有生效,那基本可以肯定是上层在插入代码时初始化了一个默认值,入库时这个默认值就把数据库中设置的默认值给覆盖了!!
为什么会覆盖呢??——因为上层在初始化这个Java实体类时,对该属性设置了值!!(虽然没有明确使用setxxx设置,但通过结果,我们可以得出,它确实隐含设置了,如果没有隐含设置,它应该不会被覆盖)
为什么上层的实体类初始化时把这个属性初始化成了NULL呢,这个属性的类型不是float吗??——因为使用的不是Java的基本类型float,而是它的装箱类型Float,后者和前者相比,就大大不一样了,后者是一个Java对象,Java对象拥有一切对象的共性,比如公共方法,还有Float对象自己封装的方法等,那么回到问题,既然是对象,那么它的默认值就是NULL,没错吧?!
如何解决呢??
非常简单:
1、在Java实体类入库之前,明确使用setXxx,给该属性设置初始值;
2、直接在Java实体类定义属性的地方,赋值初始值,即private Float xxx = 0.0F;
聪明的你,或许已经看出来了,后者更符合我们的需求,而不应该在代码中显示set!
后续,引发的思考——以终为始,我们最终的目的不就是为了给该属性设置默认值吗??
为何要依赖数据库,为何要依赖ORM??
直接在Java实体类定义的地方,给它赋值一个你想要的默认值不就得了,如果想覆盖默认值,就setXxx,不想就不用管,多好!!
再度思考,我们或许可以依赖数据库(数据库不生效时再考虑上层直接赋值),但不应该依赖ORM!!