Hibernate双向一对一对象关系模型映射

时间:2021-11-20 16:27:34

一个员工一辆车:one-to-one

实现一:让汽车表中的外键唯一

 create table emp
(
eid int primary key auto_increment,
ename varchar
);
create table car
(
cid int primary key auto_increment,
cnumber varchar,
eid int,
constraint fk_eid foreign key(eid) referecnces emp(eid),
constraint uk_eid unique(eid)
);

实现二:让汽车表中的主键引用员工表的主键,汽车表中的主键也充当外键

 create table emp
(
eid int primary key auto_increment,
ename varchar
);
create table car
(
cnumber varchar,
cid int,
constraint fk_cid foreign key(cid) referecnces emp(eid),
constraint pk_cid primary key(cid)
);

2.1描述java的数据模型

Hibernate双向一对一对象关系模型映射

2.2配置pojo类

Hibernate双向一对一对象关系模型映射

2.3数据库的数据模型

Hibernate双向一对一对象关系模型映射

2.4进行curd操作

2.4.1 添加员工

 /**
* 添加员工信息
* ****/
@Test
public void saveEmp()
{
//获得Session
Session session=sf.openSession();
//开启事务
Transaction tr=session.beginTransaction();
//创建员工对象
Emp emp= new Emp();
emp.setEname("张三");
session.save(emp);
//提交事务
tr.commit();
//释放资源
session.close();
}

2.4.2添加车辆信息

 /**
* 添加车辆信息
* ****/
@Test
public void saveCar()
{
//获得Session
Session session=sf.openSession();
//开启事务
Transaction tr=session.beginTransaction();
//创建汽车对象
Car car = new Car();
car.setCname("奥拓");
//创建员工对象
Emp emp=new Emp();
emp.setEid(1); //给定的id数据库必须存在[A1]
//指定汽车对应的员工
car.setEmp(emp);
session.save(car);
//提交事务
tr.commit();
//释放资源
session.close();
}

2.4.3 修改员工信息

 /**
* 修改员工信息
* ****/
@Test
public void updateEmp()
{
//获得Session
Session session=sf.openSession();
//开启事务
Transaction tr=session.beginTransaction();
//查询员工对象
Emp emp= (Emp) session.get(Emp.class, 1);
emp.setEname("李四");
//获得该员工的车辆对象
Car car = emp.getCar();
car.setCname("VOV");
//提交事务
tr.commit();
//释放资源
session.close();
}

2.4.4添加新员工新车辆

默认的级联效果:因为car的主键需要引用emp的主键,所以emp必须首先进行保存

 /**
* 添加车辆和员工信息
* ****/
@Test
public void saveCarEmp()
{
//获得Session
Session session=sf.openSession();
//开启事务
Transaction tr=session.beginTransaction();
//创建汽车对象
Car car = new Car();
car.setCname("奥拓");
//创建员工对象
Emp emp=new Emp();
emp.setEname("王五");
//指定汽车对应的员工
car.setEmp(emp);
session.save(car);
System.out.println("emp--------------"+emp.getEid());
//提交事务
tr.commit();
//释放资源
session.close();
}

2.4.5删除员工信息

 /***通过员工删除汽车***/
@Test
public void deleteEmp()
{
//获得Session
Session session=sf.openSession();
//开启事务
Transaction tr=session.beginTransaction();
//查询员工的对象
Emp emp= (Emp) session.get(Emp.class, 1);
//删除子表
session.delete(emp.getCar());
//删除主表
session.delete(emp);
//提交事务
tr.commit();
//释放资源
session.close();
}

2.4.6查询员工信息

员工姓名     车辆名称

 /***查询员工信息***/
@Test
public void selectEmp()
{
//获得Session
Session session=sf.openSession();
//开启事务
Transaction tr=session.beginTransaction();
//查询员工的对象
List<Emp> elist=session.createCriteria(Emp.class).list();
for(Emp e:elist){
System.out.println(e.getEname()+"\t"+e.getCar().getCname());
}
//提交事务
tr.commit();
//释放资源
session.close();
}

Emp的id必须在数据库存在,而且某个员工的id只能使用一次。

Emp的id是cari的主键和外键