Hibernate里的重复记录

前几天APIS爆出了个奇怪的BUG:某个小组关闭任务后,任务自动被duplicate,然后子任务也丢失了。手工查看数据库,发现数据库里居然只有一条Task记录,Hibernate却返回两条。findById(id为主键)居然会返回两条记录,这就奇了怪了。
用Firebug看记录,发现抛出了异常。”More than one row with the given identifier was found”。可是数据库里明明只有一条记录啊。二话不说google发现了这个post,顿时想起来由于关联(association)而产生万恶的outer join。排查了几个关联(出问题的那个类偏偏是最heavily-associated),终于在一个与Part类<one-to-one>上发现了问题。虽然是<one-to-one>关联,却发现另外一方(Part)存在重复的记录,直接影响到Task类。找到原因,assign给Part类的责任人,问题解决。

发现对hibernate的了解太少了

前几天赶工Virtualcampus,应用了一些hibernate的高级映射,比如<any>等。然后发现对unique, inverse, cascade的了解还是太少,基本上停留在会用工具生成代码的水平上,不知道怎么手写,对于性能上就更不懂了。刚翻出来hibernate_reference,补了一些东西。比如DetachedCriteria,  Bag和Set等等。