一个员工一辆车: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的数据模型

2.2配置pojo类

2.3数据库的数据模型

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的主键和外键

Hibernate双向一对一对象关系模型映射的更多相关文章

  1. Hibernate双向多对多对象关系模型映射

    1 双向many-to-many 业务模型: 描述员工和项目 一个员工同时可以参与多个项目 一个项目中可以包含多个员工 分析:数据库的数据模型,通过中间关系表,建立两个one-to-many构成man ...

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

    双向one-to-many 描述部门和岗位:一个部门有多个岗位 将单向的one-to-many 和many-to-one合并. 4.1双向的one-to-many数据库模型 create table ...

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

    1 hibernate 的对象关系映射 Orm: 类-----表 属性------字段 对象------记录 表:在数据库中存在主外键的关系,反向工厂类是由表生成,在由表生成类的时候,类和类之间存在者 ...

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

    单向的many-to-one 案例: 班级和学生 父亲和子女 单向:只能由其中一方维护关系 Many-to-one中有many的一方法维护或者体现两者之间的关系. 单向的many-to-one描述学生 ...

  5. python下申明式的对象关系DB映射器--Pony

    之前看到了Sails.js的waterline提供了声明式的关系型对象与DB的映射器,惊为天人,可以说是极大地提升了效率. 利用waterline的对象关系模型,用户可以直接使用javascript语 ...

  6. Hibernate (开源对象关系映射框架)

    一.基本介绍1.它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm(对象关系映射)框架,hibernate可以自动生成SQL语句,自动执行: Hibern ...

  7. Hibernate的核心对象关系映射

    Hibernate的核心就是对象关系映射: 加载映射文件的两种方式: 第一种:<mapping resource="com/bie/lesson02/crud/po/employee. ...

  8. ORM对象/关系模型

    1 ORM 对象关系映射(ORM)提供了概念性的.易于理解的模型化数据的方法.ORM方法论基于三个核心原则: 简单:以最基本的形式建模数据. 传达性:数据库结构被任何人都能理解的语言文档化. 精确性: ...

  9. Django之ORM对象关系模型

    MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需 ...

随机推荐

  1. 安装 vue.js和第一个hello world

    一.在自己的项目文件中使用npm下载vue npm install vue 二.在文件中引入vue.js 三.第一个hello world 注:scritpt代码必须写在html代码的下面

  2. windows下调用外部exe程序 SHELLEXECUTEINFO

    本文主要介绍两种在windows下调用外部exe程序的方法: 1.使用SHELLEXECUTEINFO 和 ShellExecuteEx SHELLEXECUTEINFO 结构体的定义如下: type ...

  3. FineUI第十四天---布局之垂直布局和水平布局

    布局值水平布局和垂直布局 垂直盒子布局和水平盒子布局非常灵活易用,在很大程度上能够取代锚点布局,行布局和列布局. 1.垂直盒子布局: BoxConfigAlign:控制子容器的的尺寸 Start:位于 ...

  4. Effective Java 读书笔记之五 枚举和注解

    Java1.5中引入了两个新的应用类型家族,新的类为枚举类型,新的接口为注解类型. 一.用enum代替int常量 1.枚举值由一组固定的常量组成合法值的类型. 二.用实例域代替序数 1.不要根据枚举的 ...

  5. (转)JAVA之桥接模式

    原文地址:http://blog.sina.com.cn/s/blog_4080505a0101dzib.html 桥模式:将某个问题抽象的不同形式分别与该问题的具体实现部分相分离,使他们都可以独立变 ...

  6. 30秒攻破任意密码保护的PC:深入了解5美元黑客神器PoisonTap

    近日,著名硬件黑客Samy Kamkar利用5美元设备打造的黑客工具PoisonTap,只需30秒,就可以攻破设置有任意密码的电脑系统,并实现长期后门安装.PoisonTap不是暴力破解密码,而是绕过 ...

  7. GR32 TImage32的图层绘制原理

    转载:http://blog.sina.com.cn/s/blog_491aced20100ded4.html TImage32的继承顺序如下:TCustomControl->TCustomPa ...

  8. 9.5---括号是否有效(CC150)

    leetcode原题: char temp ; Stack<Character> stack = new Stack<Character>();//error:Stack< ...

  9. phpcms的评论改为留言板研究

    研究背景: phpcms里面默认是没有留言板的,之前我的博客里发过一个二次开发简介,里面有一个简单的留言板,包含前台提供表单,后台留言审核等功能,但是不提供用户登录等操作. 研究思路: phpcms里 ...

  10. @ResponseBody返回不能正确接收

    Spring-MVC中@ResponseBody返回Bean到前台接收这么一串代码,还套着HTML标签: The resource identified by this request is only ...