用hibernate做关联,表A的字段userid引用表user的userid,
<many-to-one lazy="false" name="tuser" >
<column name="userid"></column>
</many-to-one>
问题。A表里面的userid如果不存在(user表里没有这掉记录信息或者记录被删掉了),
则查询A表会出错,错误信息:
No row with the given identifier exists:有什么解决方案?可以查询A表相关数据,在处理不存在的userid时,关联信息按null处理,像视图的left outer join一样?

解决方案 »

  1.   

    many-ton-one中设置fetch="join"和not-null="true"
      

  2.   

    一样的不行,报同样错。我再把not-null="false",也报同样错。
      

  3.   

    fetch="join"和not-null="true"
    然后重新生成 数据库
      

  4.   

    把lazy改为true。如果lazy为false,那么这个对象一加载就会加载USER这个对象,因为数据库中不存在,所以会报那个错。当然,如果需要相应的User对象,OK,那就是数据库中的数据对象不完整,或者说出现了数据缺失或脏数据,那么不是hibernate配置能解决问题的了。
      

  5.   

    补充点,如果每次都需要User那么每次存与User相关的对象时,一起存入,取得时候也一起取出,那么就没有上述的问题了,当然,如果你到数据里去乱搞,那就不是技术问题了。
      

  6.   

    你是说,如果使用hibernate的关联,就必须对相应数据做外键约束或者与外键约束同样功效的手段限制相应数据的存在形式?
    hibernate的关联没法像视图的left outer join一样吗?看资料,fetch="join"配置应该就是实现这种需求。可是用起来无效。。从需求上说,并不是所有数据都应该约束的,这不是乱不乱搞的问题,这是业务需求需要。使用关联,目的不是约束,而是方便。
    例如一个网站,绝大多数数据都跟注册用户相关。可能有好几十张表。删一个用户需要删除几十张表的东西?
    用户干过的事,总不能因为用户被删,就抹杀掉跟该用户相关的所有东西。
    举个例,我在csdn写的这个帖子,createuser就是我的id,如果帖子的createuser跟user表做关联的话,是不是删除我这个用户之前必须删除我的所有帖子?这是不符合逻辑的。合理的做法是,帖子照样显示,在用户信息部分显示为“不存在的用户”之类的。一句话,我若有这种需求,就无法使用关联?
      

  7.   

    这个应该是数据库的数据有问题,和hibernate没什么关系,你表有外键约束吗
      

  8.   

    现在问题是,不做外键约束的数据,能不能使用hibernate的关联功能?
      

  9.   

    外键约束是是数据库内部的数据完整性的约束,与hibernate没有关系。就像我先前说的,解决userid不存在的问题,把lazy改为true。如果userid不存在,说明可能你也不需要这个相关的user对象。只要你不访问这个属性,那么这个user的代理就不会到数据库中去查找,就不会出错了。
      

  10.   

    哦 ,不好意思,刚才没有看清你说的问题。对于你说的那种情况,我觉得hibernate应该不好做。你可以采用另一种解决方案啊,就拿删除用户来说。可以给用户多配置一个属性字段,让用户有活动和不活动的状态来完成你说的用户不存在的问题。改删除用户为改变用户的活动状态。
      

  11.   

    想了下,还有一种解决方案,把lazy设置为true, 你封装下查询这个对象的dao,通过id查找出这个对象后,然后通过hql去查找与这个对象相关的User,如果返回结果为null或List的size为0(为1就取第一个对象),然后,自己调用setUser方法把这个User设置进去,或者如果没找到那么设置为null,替代代理对象,应该就没问题了。
      

  12.   

    把lazy=“true”改为lazy="false" 然后fech也要改一下
      

  13.   

    我也遇到过  不过我把我要查询的那个配置文件中many-to-one 这个节点中那个允许删除、修改、查询的属性设置为all就解决了
    你也可以试试啊