首页 技术 正文
技术 2022年11月17日
0 收藏 810 点赞 2,640 浏览 1960 个字

今天来说说hibernate中的多对多关联映射,多对多关联映射涉及到单向映射和双向映射2种。

首先举个多对多关联例子:用户User和角色Role,一个用户可以属于多个角色,一个角色可以有多个用户。这就是典型的多对多关联的例子。而单向关联映射则是只能由A端去操作B端,B端不能操作A端的数据。而双向关联映射则是A,B两端都可以操作另一端的数据。

先说单向关联映射,实体类如下:

  1. <span style=”font-size:18px”>/**
  2. * 学生类
  3. * @author Longxuan
  4. *
  5. */
  6. public class User {
  7. private int id;
  8. private String name;
  9. private Set<Role> roles;
  10. //此处省略get和set方法
  11. }
  12. /**
  13. * 班级类
  14. * @author Longxuan
  15. *
  16. */
  17. public class Role {
  18. private int id;
  19. private String name;
  20. //此处省略get和set方法
  21. }
  22. </span>

映射文件:

  1. <span style=”font-size:18px”><?xml version=”1.0″?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. “-//Hibernate/Hibernate Mapping DTD 3.0//EN”
  4. “http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd”>
  5. <hibernate-mapping package=”com.bjpowernode.hibernate”>
  6. <class name=”User” table=”t_user”>
  7. <id name=”id”>
  8. <generator class=”native”/>
  9. </id>
  10. <property name=”name”/>
  11. <set name=”roles” table=”t_user_role”>
  12. <key column=”user_id”></key>
  13. <many-to-many class=”Role” column=”roleid”></many-to-many>
  14. </set>
  15. </class>
  16. <class name=”Role” table=”t_role”>
  17. <id name=”id”>
  18. <generator class=”native”/>
  19. </id>
  20. <property name=”name”/>
  21. </class>
  22. </hibernate-mapping></span>

User类有Role的Set集合,而且映射文件中也设置了Set标签和many-to-many标签,所以可以通过User操作Role,但是却不能从Role中操作数据。多对多的关系维护用到了第三张表t_user_role。它存放了User和Role的主键。

从上面的单向多对多关联映射来看,我可以查某个用户属于哪些角色,但是却不能查某个角色中有哪下用户。所以为了解决这个问题,我们采用双向关联映射。

其实说白了,双向关联映射就是在2端都设置一下映射关系。即在Role中同样添加User的set集合:

  1. <span style=”font-size:18px”>/**
  2. * 班级类
  3. * @author Longxuan
  4. *
  5. */
  6. public class Role {
  7. private int id;
  8. private String name;
  9. private Set<User> users;
  10. //此处省略get和set方法
  11. }
  12. </span>

映射文件中的Role部分也要做相应的修改:

  1. <span style=”font-size:18px”><class name=”Role” table=”t_role”>
  2. <id name=”id”>
  3. <generator class=”native”/>
  4. </id>
  5. <property name=”name”/>
  6. <set name=”users” table=”t_user_role”>
  7. <key column=”roleid”></key>
  8. <many-to-many class=”User” column=”user_id”></many-to-many>
  9. </set>
  10. </class></span>

值得注意的是,配置文件中的table和两个column,都必须是一致的。否则肯定会出错的。如果表名不一样了,那么就会生成2张中间表,一张有User维护,一张有Role。因为它变成了2个多对多单向关联映射。如果列名不一致了,就会出列来。还是变成了2个多对多单向关联映射。同时数据也发生了冗余。

所以双向关联映射,一定要保证2端的映射关系都设置一致了。才能称之为“双向关联映射”。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,092
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,568
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,416
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,189
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,825
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,908