其实配置one-to-many的映射很简单,就是在one所代表的这个类中添加一个集合对象,一般用set,来保存对应的many所代表的那个类的对象,比如,一个person对应多个order,(一个人对应多个订单),那么在person类中添加private Set
这样,一个单向的一对多关系就配置完成了,在主程序中新建order对象,保存进set中,再把person.setOrder(set),然后保存order对象,保存person对象就行了。但是这样配置有很大的问题,在数据库中的处理是先是往order表和person表中插入数据,但是order表的外键列插入的是null,然后执行更新语句,更新order表的外键列,把它设置成对应的personid
如下控制台输出的信息:(里面有张表是userinfo而不是personinfo)
Hibernate: insert into USERINFO (username, password, userid) values (?, ?, ?)
Hibernate: insert into ORDERINFO (product, oid) values (?, ?)
Hibernate: insert into ORDERINFO (product, oid) values (?, ?)
Hibernate: insert into ORDERINFO (product, oid) values (?, ?)
Hibernate: update ORDERINFO set USERID=? where oid=?
Hibernate: update ORDERINFO set USERID=? where oid=?
Hibernate: update ORDERINFO set USERID=? where oid=?
这样操作的话性能就很不好了,
如果设置双向一对多关联,那么就很好了,就是在order类中加一个属性private Person person,然后提供get,set方法,然后在Order.hbm.xml中配置
控制台输出信息如下:
Hibernate: insert into USERINFO (username, password, userid) values (?, ?, ?)
Hibernate: insert into ORDERINFO (product, USERID, oid) values (?, ?, ?)
Hibernate: insert into ORDERINFO (product, USERID, oid) values (?, ?, ?)
Hibernate: insert into ORDERINFO (product, USERID, oid) values (?, ?, ?)
就只有4条插入语句在操作数据库了。
关于双向一对多的操作注意一下几点:(引用自李刚的JAVAEEssh整合开发那本书)
1.先持久化one的对象
2.先设置one和many的关联关系,在保存many对象,否则还是会出现先插入,然后再更新的重复操作数据库的现象
3.不要通过one的那一端来控制关联关系,可以设置set的inverse=“true”来控制,或者在主程序中不通过设置set来关联两个类