《我的 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)
闽公网安备 35060202000074号