Hibernate单向多对一对象关系模型映射

本文详细介绍了单向Many-to-One关系的概念,如班级与学生、父亲与子女,并通过数据库建模和Java代码展示了如何在数据库和应用程序中实现这种关系。在数据库层面,使用了主外键关联;在Java模型中,通过Hibernate框架进行配置。在添加、更新、查询和删除操作中,探讨了不同方法的效率和使用场景。
摘要由CSDN通过智能技术生成

单向的many-to-one

案例:

      班级和学生

      父亲和子女

      单向:只能由其中一方维护关系

      Many-to-one中有many的一方法维护或者体现两者之间的关系。

单向的many-to-one描述学生和班级的关系。

create table t_clazz
(
    cid int primary key auto_increment,
    cname varchar not null
);
create table t_ student
(
    sno int primary key auto_increment,
    snamn varchar,
    cid int,
    constraint fk_id foreign key(cid) references t_clazz(id)
);

3.1单向many-to-one数据库模型

 

数据库还是主外键关系。

3.2单向many-to-one java模型

 

3.3单向many-to-one配置

 

3.4进行crud操作

3.4.1添加班级信息

主表中添加数据

/***
 * 添加班级信息
 * ***/
@Test
public void testSaveClasses(){
    //1获得会话session
    Session session=sf.openSession();
    //2开启事务
    Transaction tr=session.beginTransaction();
    //3进行增加操作
    Classes  cls = new Classes();
    //cls对象封装数据
    cls.setCname("java逆袭班");
    session.save(cls);
    //提交事务
    tr.commit();
    //释放资源
    session.close();
}

3.4.2 添加学生信息(1)

      将学生分配到已经存在的某个班级

/***
 * 添加学生信息,同时建立和已存在班级的关系
 * ***/
@Test
public void testSaveStudent(){
    //1获得会话session
    Session session=sf.openSession();
    //2开启事务
    Transaction tr=session.beginTransaction();
    //创建学生对象
    Student stu=new Student();
    stu.setSname("逆袭的典范");
    //查询建班级对象
    Classes  cls=(Classes) session.get(Classes.class, 1);
    stu.setCls(cls); //建立了学生和班级的关系(cls必须包含唯一标识)
    session.save(stu);
    //提交事务
    tr.commit();
    //释放资源
    session.close();
}

3.4.3添加学生信息(2)

添加学生信息,同时添加班级信息,建立关系

给many-to-one加入cascade属性=“save-update”级联保存

/***
 * 添加学生信息,同时建立和新班级的关系
 * ***/
@Test
public void testSaveStudent2(){
    //1获得会话session
    Session session=sf.openSession();
    //2开启事务
    Transaction tr=session.beginTransaction();
    //创建学生对象
    Student stu=new Student();
    stu.setSname("逆袭的典范");
    //创建班级对象
    Classes  cls=new Classes();
    cls.setCname("盟主修炼班");
    stu.setCls(cls); //建立了学生和班级的关系(cls必须包含唯一标识)[A1] 
    session.save(stu);
    //提交事务
    tr.commit();
    //释放资源
    session.close();
}

对比:如果通过one的一方关联保存many的一方,数据保存后,进行更新操作建立关系

      通过many的一方关联保存one的一方法,直接执行两条insert语句,效率高。

3.4.4更新学生信息

同时更新班级信息

@Test
public void testUpdateStudent()
{
    //1获得会话session
    Session session=sf.openSession();
    //2开启事务
    Transaction tr=session.beginTransaction();
    //查询学生对象
    Student stu=(Student) session.get(Student.class, 1);
    //修改属性
    stu.setSname("东方必败");
    //获得stu对象关联的班级对象
    Classes cls=stu.getCls();
    cls.setCname("java基础版");
    //创建班级对象
    session.update(stu);
    //提交事务
    tr.commit();
    //释放资源
    session.close();
}

3.4.5查询学生信息

      同时关联该学生的班级信息

/***
 * 查询学生信息
 * 存在着延迟加载的现象.
 * ***/
@Test
public void testSelectStudent()
{
    //1获得会话session
    Session session=sf.openSession();
    //2开启事务
    Transaction tr=session.beginTransaction();
    //查询所有学生对象
    List<Student> slist=session.createCriteria(Student.class).list();
    //遍历学生的集合
    for(Student s:slist)
    {
        System.out.println(s.getSname()+"\t\t"+s.getCls().getCname());
    }
    //提交事务
    tr.commit();
    //释放资源
    session.close();
}

3.4.6删除学生信息

删除子表中的数据,直接删除。

/***
 * 修改学生信息
 * ***/
@Test
public void testDeleteStudent()
{
    //1获得会话session
    Session session=sf.openSession();
    //2开启事务
    Transaction tr=session.beginTransaction();
    //查询学生对象
    Student stu=(Student) session.get(Student.class, 1);
    session.delete(stu);
    //提交事务
    tr.commit();
    //释放资源
    session.close();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值