读书人

hibernate3.2(9)多对多关联映射

发布时间: 2012-08-24 10:00:20 作者: rapoo

hibernate3.2(九)多对多关联映射

多对多关联映射通常采用第三方表,这张表存储了他们之间的关联关系。

?

一、单向多对多关联映射:

用户和角色属于多对对关系,一个用户可以拥有多个角色,一个角色也可以属于多个用户。

?

set标签中的name指的是user的关联关系字段,set代表了中间表,用table指定中间表的名字,用key 的column属性作为外键指向user表的userid,many-to-mang的column作为外键指向role表的roid,构成了复合主键(由userid和roleid构成的)。

?Role.hbm.xml:

?

打印输出:

Hibernate: select user0_.userid as userid1_0_, user0_.username as username1_0_ from t_User user0_ where user0_.userid=?
user.username = 冰吼
Hibernate: select roles0_.userid as userid1_, roles0_.roleid as roleid1_, role1_.roleid as roleid0_0_, role1_.rolename as rolename0_0_ from t_User_Role roles0_ left outer join t_Role role1_ on roles0_.roleid=role1_.roleid where roles0_.userid=?
user.role.rolename = 架构师
user.role.rolename = 程序员

?

?

二、双向多对多关联映射:

双向多对多关联映射与单向的基本一致,不同之处就是在双发都加入了set集合来保存关联关系,但是在存储字段的时候,最好指定根据一方来添加,两边都存储容易造成混乱,在其中的一方映射文件的set标签中加入inverse = "true",将控制权交给另一方处理。【inverse属性只能应用于一对多双向关联、多对多双向关联】

修改Role.java:

?

?

                 /** * save role casecad user */public void testSave(){Session session = HibernateUtils.getSession();try {session.beginTransaction();User user1 =new User();user1.setUsername("冰吼");User user2 =new User();user2.setUsername("蓝胖");Set users = new HashSet<User>();users.add(user1);users.add(user2);Role role = new Role();role.setRolename("架构师");role.setUsers(users);session.save(role);session.getTransaction().commit();} catch (HibernateException e) {e.printStackTrace();session.getTransaction().rollback();}finally{HibernateUtils.closeSession(session);}}

???

加入了inserse = "true",就不能从Role端存入数据,用以上测试方法存数据,中间表是不能存入数据的,但是去掉inserse就可以,但为了防止出错,还是加inverse由指定固定一方控制添加比较好。

读书人网 >软件架构设计

热点推荐