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

时间:2022-04-26 16:07:13

单向的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数据库模型

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

数据库还是主外键关系。

3.2单向many-to-one java模型

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

3.3单向many-to-one配置

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

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();
}