java之hibernate之多对多双向关联映射
1.比如在权限管理中,角色和权限之间的关系就是多对多的关系,表结构为:
2.类结构
Role.java
public class Role implements Serializable{ private int id; private String name; private Set<Permission> permissions=new HashSet<Permission>(); public Role() { } public Role(String name) { super(); this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<Permission> getPermissions() { return permissions; } public void setPermissions(Set<Permission> permissions) { this.permissions = permissions; } }
Permisssion.java
public class Permission implements Serializable{ private int id; private String name; private Set<Role> roles; public Permission() { // TODO Auto-generated constructor stub } public Permission(String name) { super(); this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<Role> getRoles() { return roles; } public void setRoles(Set<Role> roles) { this.roles = roles; } }
3.映射文件信息
Role.hbm.xml
<hibernate-mapping package="cn.sxt.pojo"> <class name="Role" table="t_role"> <id name="id"> <generator class="native"> </generator> </id> <property name="name"/> <set name="permissions" table="t_role_permission"> <!-- 当前类在连接表中的外键 --> <key column="rid"></key> <many-to-many column="pid" class="Permission"></many-to-many> </set> </class> </hibernate-mapping>
Permission.hbm.xml
<hibernate-mapping package="cn.sxt.pojo"> <class name="Permission" table="t_permission"> <id name="id"> <generator class="native"> </generator> </id> <property name="name"/> <set name="roles" table="t_role_permission" inverse="true"> <!-- 当前类在连接表中的外键 --> <key column="pid"></key> <many-to-many column="rid" class="Role"></many-to-many> </set> </class> </hibernate-mapping>
4.测试
public class HibernateTest { /** * 生成数据库表的工具方法 * */ @Test public void testCreateDB(){ Configuration cfg = new Configuration().configure(); SchemaExport se = new SchemaExport(cfg); //第一个参数 是否打印sql脚本 //第二个参数 是否将脚本导出到数据库中执行 se.create(true, true); } /** * 初始化表数据 */ @Test public void testInit(){ Session session = null; Transaction tx = null; try { session = HibernateUtil.getSession(); tx = session.beginTransaction(); Permission p1 = new Permission("增加用户"); Permission p2 = new Permission("删除用户"); Permission p3 = new Permission("查询用户"); Permission p4 = new Permission("修改用户"); Role r1 = new Role("管理员"); r1.getPermissions().add(p1); r1.getPermissions().add(p2); r1.getPermissions().add(p3); r1.getPermissions().add(p4); Role r2 = new Role("vip"); r2.getPermissions().add(p3); r2.getPermissions().add(p4); session.save(p1); session.save(p2); session.save(p3); session.save(p4); session.save(r1); session.save(r2); tx.commit(); } catch (Exception e) { if(tx!=null) tx.rollback(); }finally { HibernateUtil.close(); } } /** */ @Test public void testGetData(){ Session session = HibernateUtil.getSession(); Role role = (Role)session.get(Role.class, 1); System.out.println(role.getId()+"---"+role.getName()); System.out.println("-------------"); for(Permission p:role.getPermissions()){ System.out.println(p.getId()+"---"+p.getName()); } System.out.println("=========================="); Permission p = (Permission)session.get(Permission.class, 3); System.out.println(p.getId()+"----"+p.getName()); for(Role r:p.getRoles()){ System.out.println(r.getId()+"---"+r.getName()); } HibernateUtil.close(); } }
分类:
java框架学习
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现