hibernate框架——数据库的多对多关系!
众所周知,数据库有三种数据模型,一对一,一对多,多对多,在前面的文章中主要介绍了一对一和一对多的表关系搭建和使用sql语句进行增删改查。
使用hibernate框架主要分为三步:
在这里演示的是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
!