服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

《我的 o/r mapping 之旅》勘误及补充

《我的 o/r mapping 之旅(二)》,有一段对 people.hbm.xml 的分析,谈到为什么使用 inverse=”true”:

在车辆管理系统中,代表着一个拥有者拥有多台车辆。以 java.util.set 类型表示。 inverse 用于标识双向关联中的被动方一端。inverse=false 的一方(主控方)负责维护关联关系;在车辆管理系统中, autoinfo 作为主控方,应该把它设为“true”。这就好比你(被动方 one)在某个聚会上散发了许多名片,但是有可能你不清楚接收者(主动方 many)的具体背景;这个不要紧,接收者在必要的时候会和你联系就是了(主动维护关系)。

红色标识的句子容易让人产生歧异,好像是在说把 atuoinfo 设置成“true”了。应改为:

在车辆管理系统中,atuoinfo 作为主控方,应该在 people 中设置 inverse =“true”。

沿着思路往下走,你也许会问:什么才叫“主动维护关系”?不妨看看下面的代码(摘自《我的 o/r mapping 之旅(三)》):

autoinfo ai=new autoinfo();
people people=new people();
public void dotest() {
   try {
      configuration cfg = new configuration().configure();
      sessionfactory sessions = cfg.buildsessionfactory();
      session session = sessions.opensession();
      transaction tx = session.begintransaction();
   
      ai.setlicenseplate("a00001");
      ai.setownerno(people);
      people.setaddress("中国");
      people.setname("张三");
      people.addtoautoinfoset(ai);
      session.save(people);
      tx.commit();
      session.close();
   } catch (exception e) {
      system.out.println(e);
   }
}


把“ai.setownerno(people)”注解了试试,由于 autoinfo 没有主动维护关系,导致 auto_info 表中 owner_no 字段为“null”。自然 autoinfo 与 poople 就不存在任何联系了。

人类的求知欲很强烈!
为什么非要用 autoinfo 作为主控方?people 作主控方不行?好吧,为 people.hbm.xml 删除inverse=”true”,再运行以上程序,其实也能保存,只是多了一条sql:“update auto_info set owner_no=? where auto_id=?”,这就是 autoinfo 被动地修改和 people 的联系。多执行一次 sql 意味着多了一些开销,这是对性能不利的!


《我的 o/r mapping 之旅(三)》,有一段对张三第二次买车的程序和描述:

 autoinfo ai = new autoinfo();
 people people = new people();
 public void dotest() {
  try {
      configuration cfg = new configuration().configure();
      sessionfactory sessions = cfg.buildsessionfactory();
      session session = sessions.opensession();
      transaction tx = session.begintransaction();
      people =
       (people) session
        .find(
         "from people where owner_id=1")
        .get(0);
      ai.setlicenseplate("a00002");
      ai.setownerno(people);
      people.getautoinfoset().add(ai);
      session.save(people);
      tx.commit();
      session.close();
  } catch (exception e) {
      system.out.println(e);
  }
}


到这里,也许你会有这样的想法:“应该可以直接向 auto_info 表插入记录,不通过 people 对象中转,像写 sql 一样 easy。” 错了!以前直接写 sql 是可以办到的,不过现在我们用的可是 hibernate ,一切都要以对象行事,看见 ai.setownerno(people) 了吗?传入参数是个 people 对象实例,不是简单的字段喔。

这段解释太绝对了,事实上可以直接保存 autoinfo 对象,而不用通过保存 people 来中转:

autoinfo ai = new autoinfo();
people people = new people();
public void dotest() {
  try {
      configuration cfg = new configuration().configure();
      sessionfactory sessions = cfg.buildsessionfactory();
      session session = sessions.opensession();
      transaction tx = session.begintransaction();
      people =
       (people) session
        .find(
         "from people where owner_id=1")
        .get(0);
      ai.setlicenseplate("a00002");
      ai.setownerno(people);
      session.save(ai);
      tx.commit();
      session.close();
  } catch (exception e) {
      system.out.println(e);
  }
}



《我的 o/r mapping 之旅(四)》,删除 people 表及其关联的 auto_info 表时,程序是没有错,不过有更简单的办法来删除:

  try {
   configuration cfg = new configuration().configure();
   sessionfactory sessions = cfg.buildsessionfactory();
   session session = sessions.opensession();
   transaction tx = session.begintransaction();
   session.delete("from people where owner_id=1");
   tx.commit();
   session.close();
  } catch (exception e) {
   system.out.println(e);
  }

hibernate 中,要完成一次操作,可以有多种实现方式,哪种最好,就要靠自己定夺了。


(请注意!引用、转贴本文应注明原作者:rosen jiang 以及出处:http://blog.csdn.net/rosen

扫描关注微信公众号