一个员工一辆车: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. 使用Carthage安装第三方Swift库

    http://blog.crazyphper.com/?p=3661 carthage update

  2. iOS并发编程指南之同步

    1.gcd fmdb使用了gcd,它是通过 建立系列化的G-C-D队列 从多线程同时调用调用方法,GCD也会按它接收的块的顺序来执行. fmdb使用的是dispatch_sync,多线程调用a ser ...

  3. 应用alter index ××× monitoring usage;语句监控索引使用与否

    随着时间的累积,在没有很好的规划的情况下,数据库中也许会存在大量长期不被使用的索引,如果快速的定位这些索引以便清理便摆在案头.我们可以使用"alter index ××× monitorin ...

  4. POJ 2631 DFS+带权无向图最长路径

    http://poj.org/problem?id=2631 2333水题, 有一个小技巧是说随便找一个点作为起点, 找到这个点的最远点, 以这个最远点为起点, 再次找到的最远点就是这个图的最远点 证 ...

  5. Codeforces 727 F. Polycarp's problems

    Description 有一个长度为 \(n\) 有正负权值的序列,你一开始有一个值,每次到一个权值就加上,最少需要删掉多少数值才能到序列末尾.\(n \leqslant 750,m \leqslan ...

  6. 1.6---旋转二维数组,旋转图像像素,旋转矩阵,90度(CC150)

    import java.util.*; public class Transform { public int[][] transformImage(int[][] matrix, int n) { ...

  7. 蓝牙模块连接后出现ANR,日志记录

    11-25 16:29:48.433 14507-14561/myapplication.com.myblue W/MALI: glDrawArrays:714: [MALI] glDrawArray ...

  8. Binary Tree Vertical Order Traversal

    Given a binary tree, return the vertical order traversal of its nodes' values. (ie, from top to bott ...

  9. Python操作PDF与Tiff文件

    1.PDF文件的合并与拆分 pypdf http://www.douban.com/note/455252403/ http://www.redicecn.com/html/Python/201301 ...

  10. c++转义字符、指针

    上篇博客的答案: 1: // DataTypeDemo.cpp : 定义控制台应用程序的入口点. 2: // 3:  4: #include "stdafx.h" 5: #incl ...