hibernate多对多关系表的搭建和‘增删改查’

hibernate框架——数据库的多对多关系!

众所周知,数据库有三种数据模型,一对一,一对多,多对多,在前面的文章中主要介绍了一对一和一对多的表关系搭建和使用sql语句进行增删改查。

使用hibernate框架主要分为三步:

  1. 创建类

    • 类中需要包含表中需要的所有属性
  2. 创建映射文件

    • 映射文件需要包含刚刚创建的类的属性
  3. 添加配置文件

    • 将映射文件加入cfg.xml文件中

    创建多对多表关系

在这里演示的是hibernate建立数据库关系中的多对多关系,首先创建两个类,相信大家都玩过游戏,没有玩过也不要紧,不会妨碍我们去理解。这里我选择的是玩家和英雄,一个玩家可以拥有多个英雄,一个英雄也可以被多个玩家拥有。

//两个类的属性
//角色类
public class Role {
    private int rid;//英雄id
    private String name;//英雄姓名
    private String description;//描述信息
    Set<Player> players = new HashSet<>();//英雄所属角色
}
//玩家类
public class Player {
    private int pid;//玩家id
    private String name;//玩家姓名
    private String gender;//玩家性别
    Set<Role> roles = new HashSet<>();//玩家可拥有英雄
}
//这里只有属性,读者需要自行添加set和get方法

如果读者添加了其他属性,那么需要在映射文件中添加相对的属性,添加两个类映射文件,注意这里是以xml结尾的文件。

<!--这里是玩家的相关映射文件-->
<hibernate-mapping>
    <!--找到类所在之处,然后设置表名 tb_playe-->
    <class name="com.hbnu.pojo.Player" table="tb_player">
        <id name="pid"><!--设置主键-->
            <generator class="native"></generator>
        </id>
		<!--设置其他属性-->
        <property name="name"/>
        <property name="gander"/>
        <!-- table属性值表示第三张表的名称,这里使用了联级更新,更新了一张表,另外一张表也会更新-->
        <set name="roles" table="tb_pr" cascade="save-update ">
        <!--  pid表示在第三张表的外键名称-->
            <key column="pid"></key>
            <!--多对多
             class:表示多对多当前配置文件所属类的另外一方的全路径名称
             column:表示多对多当前配置文件所对应的另外一方表在第三张中间表中的名称-->
            <many-to-many class="com.hbnu.pojo.Role" column="rid"></many-to-many>
        </set>
    </class>
</hibernate-mapping>
<!--这里是角色的相关映射文件,因为这里和玩家的内容如出一格,这里便不再赘述-->
<hibernate-mapping>
    <class name="com.hbnu.pojo.Role" table="tb_role">
        <id name="rid">
            <generator class="native"></generator>
        </id>
        <!-- 不能使用关键字进行建表 -->
        <property name="name"/>
        <property name="description" />
        <set name="players" table="tb_pr">
            <key column="rid"></key>
            <many-to-many class="com.hbnu.pojo.Player" column="pid"></many-to-many>
        </set>
    </class>
</hibernate-mapping>

编写完映射类,不能忘记在核心配置文件中加入映射文件:

<mapping resource="com/hbnu/config/Player.xml"/>
<mapping resource="com/hbnu/config/Role.xml"/>

既然已经将表创建好,只需要在表中添加数据即可,可以编写代码也可以在数据库中操作。

在这里插入图片描述

添加的数据:

在这里插入图片描述

可以来测试一下表的增删改查

删除操作:

//多对多不要使用级联删除
    @Test
    public void testManyToManyDelete(){
        SessionFactory sessionFactory = HibernateUtil.getSessionFactory();//封装了静态数据库连接,直接调用即可
        Session session = sessionFactory.openSession();//设置session工厂
		//因为修改了表中数据,注意要使用事务处理
        Transaction transaction = session.beginTransaction();
        //获取id为2的玩家信息,将其删除
        Player player = session.get(Player.class, 2);
        session.delete(player);
        transaction.commit();
        //释放资源
        HibernateUtil.close(session,sessionFactory);
    }

在这里插入图片描述

可以看见表被创建,我们在三个表中添加数据,可以开始接下来的测试阶段。测试增删改查在多对多关系中是如何编写的,首先测试删除,这里要注意多对多不要使用级联删除,在一对多中可以使用,但是在这里会出现误删的情况。所以在关系映射表中的cascade="save-update, delete"将delete删除

接下来测试修改表

//修改多对多表数据
@Test
public void testManyToManyUpdate(){
    SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    //移除id为1玩家的id为2的角色
    Player player = session.get(Player.class, 1);
    Role role = session.get(Role.class, 2);
    //对一个玩家添加某个角色
    //player.getRoles().add(role);
    //该行可以省略,因为表中是直连状态,表中数据会自己更新
    //session.update(player);
    //对一个玩家去除某个角色
    player.getRoles().remove(role);
    transaction.commit();
    HibernateUtil.close(session,sessionFactory);
}

在这里插入图片描述

增加表中数据

public void testManyToManyInsert(){
    //添加一个玩家,将id为2的角色进行分配
    SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    Player player = new Player();//添加玩家
    player.setPid(3);
    player.setName("韩跳跳");
    player.setGander("男");
    Role role = session.get(Role.class,2);
    player.getRoles().add(role);//添加类
    session.save(player);//保存数据
    transaction.commit();
    HibernateUtil.close(session,sessionFactory);
}

在这里插入图片描述

查数据

//查询id为1的玩家拥有的英雄信息
@Test
public void testManyToManySelect(){
    SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
    Session session = sessionFactory.openSession();
	//sql语句
    String sql = " select * from tb_player p,tb_role r,tb_pr pr where p.pid = pr.pid and r.rid = pr.rid and p.pid=:id";
    //预编译处理
    NativeQuery<Player> sqlQuery = session.createSQLQuery(sql);
    sqlQuery.addEntity(Player.class);
    sqlQuery.setParameter("id","1");
    //输出结果集
    List<Player> players = sqlQuery.list();
    //打印结果
    for (Player player : players) {
        System.out.println(player+"-->"+player.getRoles());
    }
}

在这里插入图片描述
今天的分享就到这里,学会hibnater框架对数据库的学习和利用框架搭建需要的表格就会变得超级便捷,当然,其实这种框架有很多,比如mybatis

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值