产生此问题的缘由:
有两张表,table1和table2.产生此问题的缘由就是table1里作了关联<one-to-one>或者<many-to-one unique="true">(特殊的多对一映射,实际就是一对一)来关联table2.当hibernate查找的时候,table2里的数据没有与table1相匹配的,这样就会报No row with the given identifier exists这个错.(一句话,就是数据的问题!)
假如说,table1里有自身的主键id1,还有table2的主键id2,这两个字段.
若是hibenrate设置的单项关联,即便table1中的id2为null值,table2中id2中有值,查询都不会出错.可是若是table1中的id2字段有值,可是这个值在table2中主键值里并无,就会报上面的错!
若是hibernate是双向关联,那么table1中的id2为null值,可是table2中若是有值,就会报这个错.这种状况目前的解决办法就是改为单项关联,或者把不对应的数据改对!
这就是报这个错的缘由了,知道缘由了就相应的改就好了.或许还有些人迷惑hibernate关联都配好了,怎么会出现这样的错?其实这是编程的时候出现的问题,假如说我在添加信息的时候,页面传过来的struts的formbean到dao方法中须要封装成hibernate的po(就是hibenrate的bean),要是一个个po.get(form.set())实在太麻烦了,这样通常都会写个专门的方法来封装,遇到po.get(form.set())这种状况直接把struts的formbean对象传到此方法中封装就好了,假如我有个字段是建立人id,那么这个字段是永远不会改的,我在添加的时候还调用这个方法,这个专门封装的方法是有一些判断的,假如说我判断一下,若是遇到建立人id传过来为空值,我判断若是是空值,我把建立人id设为0,可是用户表中userid是主键从1开始自增的,那么这样数据就对应不上了,一查就会出这个错了.这个错在开发刚开始的时候常常发生,由于每一个人的模块都是由相应的人独立开发完成之后再整合在一块儿的,每一个人写单独那一块的时候每每会忽略这些,因此整合的时候这些问题每每就都一会儿全冒出来了....整合很辛苦,tnnd!
hibernate的查询的比较
hibernate的查询有不少,Query,find,Criteria,get,load
query使用hsql语句,能够设置参数是经常使用的一种方式
criteria的方式,尽可能避免了写hql语句,看起来更面向对象了。
find方式,这种方式已经被新的hibernate丢弃
get和load方式是根据id取得一个记录
下边详细说一下get和load的不一样,由于有些时候为了对比也会把find加进来。
1,从返回结果上对比:
load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常
get方法检索不到的话会返回null
2,从检索执行机制上对比:
get方法和find方法都是直接从数据库中检索
而load方法的执行则比较复杂
1,首先查找session的persistent Context中是否有缓存,若是有则直接返回
2,若是没有则判断是不是lazy,若是不是直接访问数据库检索,查到记录返回,查不到抛出异常
3,若是是lazy则须要创建代理对象,对象的initialized属性为false,target属性为null
4, 在访问得到的代理对象的属性时,检索数据库,若是找到记录则把该记录的对象复制到代理对象的target
上,并将initialized=true,若是找不到就抛出异常sql