Hibernate在配置 one-to-many时应该注意的事项

其实配置one-to-many的映射很简单,就是在one所代表的这个类中添加一个集合对象,一般用set,来保存对应的many所代表的那个类的对象,比如,一个person对应多个order,(一个人对应多个订单),那么在person类中添加private Set order ;这个属性,然后提供get,set方法,然后在Person.hbm.xml中配置

  

  

这样,一个单向的一对多关系就配置完成了,在主程序中新建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中配置

,然后在主程序中,order.set(person),要设置值(控制关联关系),其他的和上面的一样,这样

控制台输出信息如下:

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来关联两个类



你可能感兴趣的:(web开发主流框架)