模拟hibernate时发现的几个问题

     由于对hibernate认识不深,近来无事,于是想利用java的反射机制来简单实现一下hibernate的增删改查。代码就不贴了,主要说两个以前没有发现的问题。

1、首先,我们知道Entity的赋值与获取都是通过set和get来的,在生成增加SQL语句时,执行Object value = method.invoke(obj, null)这一句时会有意向不到的结果。增加一条记录的时候,如果我们把某些字段不给set方法,那么在反射的时候用get方法就不应该获取到值,像Integer、Float这种包装类型就能get到null。但是如果某些字段是int、double 这些数值类型的话就会get到0、0.0。这样就会产生一些错觉,究竟是我set了0这个数还是没有set值。我实现hibernate的增加功能时一直解决不了这个办法,后来用hibernate框架测试了一下,hibernate在这种数值类型没有set值的时候也会默认的把0存入数据库,而不能在生成SQL语句的时候进行判断是否set了值。如果用JDBC直接写SQL语句的话就直接会在table里面把没有插入的字段设为null。而如果是用Entity的set 与get方法来赋值的话就会出现0的情况。

 

2、在update的时候以前的经验都是如果直接直接new对象再set值的话如果我们只set部分值就会在生成SQL语句的时候对没有set值的字段也update让其等于null,但是如果我们的对象是get得到或者load得到的话就不会出现这种情况,这里是因为get是从数据库里面查了一条数据出来然后给这个对象的每个字段set了值,如果我们在用这个对象set值的话就相当于覆盖以前数据库里面的值,如果不set值的话,这个字段就还是以前数据库中的值。换句话说,就像上面的第一条所说 hibernate对数据库的操作都是全部字段进行的,他不会插入部分字段,也不会修改部分字段,所有字段都是修改了。但是没有set值的字段就不会覆盖掉也就不会在数据库中更改。

你可能感兴趣的:(Hibernate,的)