hibernate关联映射之多对多
我们学习了hibernate的一对一和一对多,下面就剩下一个多对多啦,这次我们就来学习一下它的多对多关联映射。
废话不多说,直接上代码:
这次我们举的例子是Group和Role,一般情况下,我们一个组可以对应多个角色,同时一个角色也可以对应多个组。
先看一下实体类代码:
?这里我们用到了一个中间表,t_group_role,在该表中指定了此表对应的列group_id,另外一个不同的地方就是我们设置了lazy="false",这个属于懒惰加载机制的内容,我们以后会讲到。这里先大概了解一下,把它设为false(也是默认值),它表明这个实体会在hibernate加载的时候全部加载进来。如果设为true,则表明当我们需要访问到此属性时才进行取出(这里的访问是指调用get方法等)。
我们再看一下另外一个映射文件:
?两个表的映射文件变化不大,主要是这里有inverse="true"表明把插入权交给TGroup,即当TGroup进行保存的时候,会把user_id和group_id同时进行插入。
下面我们看一下测试类,由于是多对多关联,类会比较长:
Hibernate: insert into t_role (name) values (?)Hibernate: insert into t_group (name) values (?)Hibernate: insert into t_role (name) values (?)Hibernate: insert into t_group (name) values (?)Hibernate: insert into t_role (name) values (?)Hibernate: insert into t_group (name) values (?)Hibernate: insert into t_group_role (role_id, group_id) values (?, ?)Hibernate: insert into t_group_role (role_id, group_id) values (?, ?)Hibernate: insert into t_group_role (group_id, role_id) values (?, ?)Hibernate: insert into t_group_role (group_id, role_id) values (?, ?)Hibernate: insert into t_group_role (role_id, group_id) values (?, ?)Hibernate: insert into t_group_role (role_id, group_id) values (?, ?)22:23:46,062 ERROR JDBCExceptionReporter:101 - Duplicate entry '13-14' for key 'PRIMARY'22:23:46,064 ERROR AbstractFlushingEventListener:324 - Could not synchronize database state with sessionorg.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update?重复的记录,这个错误看来是插入了两条重复的记录,肯定两个字段都相同,而后一个异常是因为找不到需要更新的记录。这个的原因是因为我们没有指定inverse="true",那么两个表都对t_gropu_role有责任,就因为这样,它们都会进行插入,这也就超成了前面的错误,而后面的错误更多的是由前面的错误所引起的。