Hibernate中一对一主键关联,和在表上建外键的方向有关系吗???

minisun2000 2006-10-20 11:16:46
有两个表TUser和TPasspo,两个表的形成一对一的主键关联
TUser中的配置
<one-to-one
name="TPasspo"
class="com.jingxl.hib.pojo.TPasspo"
cascade="all"
outer-join="true"
/>

TPasspo中的配置
<one-to-one
name="TUser"
class="com.jingxl.hib.pojo.TUser"
constrained="true"
/>

代码:
session = SessionFactory.currentSession();
TUser user = new TUser();
user.setId(10L);
user.setName("byf");
user.setAge(26L);

TPasspo passpo = new TPasspo();
passpo.setSerial("PCN123456");

//设置相互关联
user.setTPasspo(passpo);
passpo.setTUser(user);


Transaction tx = session.beginTransaction();
session.save(user);
tx.commit();

我在TUser的ID字段上建外键关联到TPasspo的ID就会出现“违反完整约束条件 (TEST.FK_USER2) -
未找到父项关键字”,但是如果在TPasspo的ID建外键关联到TUser的ID上就可以级联插入!

为什么会出现这个问题,网上有很多例子都是这样做的!!
...全文
437 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
djpsunday 2006-10-20
  • 打赏
  • 举报
回复
楼主这种对待看书的态度是可取的,更可取的是把问题的过程贴出来与大家分享,支持噢!我用hibernate都是放到appfuse里的
minisun2000 2006-10-20
  • 打赏
  • 举报
回复
to zhh1981(**的猪头)
你有QQ吗?还想问几个问题。能不能加我的QQ,30397825!
minisun2000 2006-10-20
  • 打赏
  • 举报
回复
发email了
Marcus-Z 2006-10-20
  • 打赏
  • 举报
回复
是啊,呵呵,或者改下配置或SAVE方法
ctu_85 2006-10-20
  • 打赏
  • 举报
回复
看来真是:尽信书不如无书


严重同意
minisun2000 2006-10-20
  • 打赏
  • 举报
回复
to zhh1981(**的猪头)
按照你的说法,是应该在TPasspo表的ID字段上建外键关联到TUser的ID字段才是正确的吧???
如果是的话,我马上个作者发个email!!
Marcus-Z 2006-10-20
  • 打赏
  • 举报
回复
还有其实:
<one-to-one
name="TUser"
class="com.jingxl.hib.pojo.TUser"
constrained="true"
/>
的constrained="true"表示你的TPasspo主键做为外键参照TUser主键,而你在表里TUser的ID字段上建外键关联到TPasspo的ID时这样就反了,违反了你定义的XML里对其的定义
minisun2000 2006-10-20
  • 打赏
  • 举报
回复
多谢楼上的了,我也以为是这样的。
不知道你看过没看过《深入浅出Hibernate》(夏昕编写的那本),他书上有个例子(书上的146页),跟我基本一样,害死一大批人啊,网上好多根据这个写的东西(比如:http://www.blogjava.net/myblog/archive/2006/07/05/56768.html)

看来真是:尽信书不如无书!
ctu_85 2006-10-20
  • 打赏
  • 举报
回复
一对多/多对一的关联维护在实际项目中使用是比较多的,在Hibernate中可采用多种方式来配置一对多的关联,如采用Set、List、Bag、Map等,具体在《Hibernate Reference》中都有详细说明。
关于inverse的设置,在一对多的情况下建议将一端的inverse设为true,而由多端去自动维护关联关系,为什么这样做其实挺容易理解的,假设org和user为一对多的关联,org.getUsers的inverse设置为false,org.getUsers().add(user);dao.update(org);当update的时候org所关联的所有user的orgId都会更新一次,可想而知这个效率,而如果改为在多端维护(多端设置为inverse=false),则是这样:user.setOrg(org);dao.update(user);当update的时候就仅仅是更新user这一条记录而已。
ctu_85 2006-10-20
  • 打赏
  • 举报
回复
如果只有一个一对一关系时,加上cascade="all"的好处是:
删除时只要delete一次,但是如果有多个一对一关系,delete一次只能删除parentPO和一项所对应的对象,而在删除其它对应项时,parentPO已经被删掉了,程序运行会出错。

Marcus-Z 2006-10-20
  • 打赏
  • 举报
回复
因为你的session.save(user);表示由user主动方插入,然后再级联插入TPasspo,而你TUser的ID字段上建外键关联到TPasspo的ID时,由于表示TPasspo为主动方,那么插入USER时由于TPasspo没插入所以不能确定起USER的ID,反过来在TPasspo的ID建外键关联到TUser的ID上由于USER为主动方,所以插入USER后再级联插入TPasspo,就能确定TPasspo所关联到USER上的ID(也即自己的主健ID)
minisun2000 2006-10-20
  • 打赏
  • 举报
回复
to djpsunday(创业从此开始,)
光看不做肯定是不行的,至少也要把书上的例子调试过关才行^_^
做到这个的时候怎么调试也不行,而且网上的例子基本上也一样,都是从TUser的ID字段上建外键关联到TPasspo的ID,自己也搞不明白,就来这里请教高人了!

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧