我系统中有一个任务表,物理表分为当前任务表A和历史任务表B;两个表的字段都一样,于是我想偷懒,就将对象B继承自对象A,并且在NHIBERANTE映射文件中将表A与表B分别映射对象A与对象B;原以为这样映射后,在读取表A和表B的纪录都没问题;
但是事与愿违,程序实际执行结果却是什么也没有(A表有数据,B表没数据),我的HQL根本没有任何条件,按理说数据应该全部读取出来,但是实际上一条数据都没出来;查看了数据库连接,查看了对象A的属性,查看了NHIBERNATE的版本,等等等等,折腾了半天.
做了很多事情,但是还是没有找到原因;最后把A重新命名为C,然后再查询,发现数据全部出来了,很是郁闷;
于是再进一步推理,发现B继承自A,在映射中A先,B后,于是大胆猜想,难道NHIBERNATE没有采用我继承后的对象B,而是采用了基类A,这样在映射文件中,势必会以最后一次注册的映射为准,也就是说虽然访问的是A表的数据,但是访问却被重定向到了B表;
然后我让B不继承自A ,把A的所有属性全部拷贝到B,再次执行查询,奇迹出现了,A表的数据出来了....
我觉得上面遇到的问题应该和经验有关系,当时为了省去一个相同对象的申明,偷懒采用了继承,但是实际结果却让人摸不着头脑;
看来以后还是少去"投机取巧"!