hibernate 数据关联一对一 3.2
第一种一对一
person和card,card的id即作为主键,又作为外键
// 各村对方的一个对象
public class Person { private Integer id;
private String name;
private Card card;
}
public class Card { private Integer id;
private String cardnum;
private Person person;
}
xxx.hbm.xml 的配置
记得在总配置文件中添加这两个配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.kaishengit.pojo"> <class name="Card" table="card">
<id name="id">
<!-- 主键生成策略变成foreign,表示又当主键又当外键 -->
<generator class="foreign">
<!-- 这个person是属性,指明用card这个类的person属性对应的表的主键作外键 -->
<param name="property">person</param>
</generator>
</id>
<property name="cardnum"/>
<one-to-one name="person" class="Person"/>
</class> </hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.kaishengit.pojo"> <class name="Person" table="person">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<!-- cascade="delete"表示删除人的时候把卡删了 -->
<one-to-one cascade="delete" name="card" class="Card"/> </class> </hibernate-mapping>
程序执行
Person p = new Person();
p.setUsername("tom"); Card c = new Card();
c.setCardnum("12");
c.setPerson(p); session.save(p);
session.save(c);
/* 这时候有两条sql,都是insert,改变save(p),save(c)的顺序式没用的
因为card的insert必须要有id,id不能为空,因为它作为主键,所以程序只能
先save(p)*/ Person p = new Person();
p.setUsername("tom"); Card c = new Card();
c.setCardnum("12"); p.setCard(c); session.save(p);
session.save(c); /* 这样做就会报错了,因为主键的生成策略是从card找person属性
所以这种情况就只能让又当主键又当外键的那个表来维护关系 */
查询 这种情况下的查询都是联接查询,有捆绑性
Card card = (Card) session.get(Card.class, 2);
System.out.println(card.getCardnum());
System.out.println(card.getPerson().getName()); Person p = (Person) session.get(Person.class, 2);
System.out.println(p.getName());
System.out.println(p.getCard().getCardnum());
删除
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.kaishengit.pojo"> <class name="Person" table="person">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<!-- cascade="delete"表示删除人的时候把卡删了 -->
<one-to-one cascade="delete" name="card" class="Card"/> </class> </hibernate-mapping>
----------------------------------------------------------
----------------------------------------------------------
----------------------------------------------------------
第二种一对一,是一对多或者多对一的特殊情况,具有延迟加载的能力
dept和Employee,dept中有eid,Employee中有deptid
// 各村对方的一个对象
public class Dept { private Integer id;
private String name;
private Employee employee;
}
public class Employee { private Integer id;
private String name;
private Dept dept;
}
xxx.hmb.xml的配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.kaishengit.pojo"> <class name="Dept" table="dept">
<id name="id">
<generator class="native"/>
</id> <property name="name"/>
<!-- 是多对一的特殊情况,需要指定unique="true"唯一性 -->
<many-to-one name="employee" class="Employee" unique="true" column="eid"/> </class> </hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.kaishengit.pojo"> <class name="Employee" table="employee">
<id name="id">
<generator class="native"/>
</id> <property name="name"/>
<!-- 是多对一的特殊情况,需要指定unique="true"唯一性 -->
<many-to-one name="dept" class="Dept" unique="true" column="deptid"/> </class> </hibernate-mapping>
程序执行
Employee e = new Employee();
e.setName("jack"); Dept d = new Dept();
d.setName("hr"); d.setEmployee(e); e.setDept(d); session.save(e);
session.save(d);
请看这里,这是双向维护关系,而且必须双向维护关系,不可避免的会多一条update语句
hibernate 数据关联一对一 3.2的更多相关文章
- hibernate 数据关联一对一
第一种一对一 person和card,card的id即作为主键,又作为外键 // 各村对方的一个对象 public class Person { private Integer id; privat ...
- hibernate 数据关联一对多 3.1
一对多,多对一 (在多的一端存放一的外键) 但是在实体类中不需要创建这个外键 // 在一的一方创建Set集合 public class User { private Integer id; priva ...
- hibernate 数据关联一对多
一对多,多对一 (在多的一端存放一的外键) 但是在实体类中不需要创建这个外键 // 在一的一方创建Set集合 public class User { private Integer id; priva ...
- hibernate 数据关联多对多 4.1
多对多,必须有一张关系表来维持关系 数据库student,teacher student_teacher 三张表 但是在pojo中只需要建立student和teacher两个类,除非关系表也代表某种业 ...
- hibernate 数据关联多对多
多对多,必须有一张关系表来维持关系 数据库student,teacher student_teacher 三张表 但是在pojo中只需要建立student和teacher两个类,除非关系表也代表某种业 ...
- hibernate之关于一对一单向,双向关联映射
[hibernate]之关于一对一单向,双向关联映射 首先我们来看,Hibernate官方对于一对一单向关联的解释: 基于外键关联的单向一对一关联和单向多对一关联差点儿是一样的. 唯一的不同就是单向一 ...
- hibernate 关系映射之 单向外键关联一对一
这里的关系指的是对象与对象之间的关系 注解方式单向关联一对一: //这个类描述的husband是一个对应一个wife的 import javax.persistence.Entity; import ...
- Hibernate中映射一对一关联(按主键映射和外键映射)和组件映射
Hibernate中映射一对一关联(按主键映射和外键映射)和组件映射 Hibernate提供了两 ...
- 初识Hibernate之关联映射(二)
上篇我们介绍了关联映射的几种形式,有单向多对一,单向一对多,还有双向一对多.本篇接着介绍有关关联映射的其他几种映射方式,主要有以下几种: 基于外键的单向一对一关联映射 基于主键的单向一对一关联映射 单 ...
随机推荐
- 基于Proxy思想的Android插件框架
意义 研究插件框架的意义在于下面几点: 减小安装包的体积,通过网络选择性地进行插件下发 模块化升级.减小网络流量 静默升级,用户无感知情况下进行升级 解决低版本号机型方法数超限导致无法安装的问题 代码 ...
- ongl 表达式
struts.xml简单配置 <!-- (默认false)设置ognl表达式是否支持静态方法 --> <constant name="struts.ognl.allowSt ...
- C++运算符重载为非成员函数
#include<iostream> using namespace std; class Complex{ public: Complex(double r=0.0,double i=0 ...
- javascript 未结束的字符串常量
1.JAVASCRIPT引用时,使用的字符语言不一致. 比如:<script type=”text/javascript” src=”xxx.js” charset=”UTF-8″>.xx ...
- 运用DIV拖拽实现resize和碰撞检测
运用DIV拖拽实现resize和碰撞检测 Div由拖拽改变大小 演示demo 当我们运用html元素"textarea"写一个文本输入框时,浏览器会自动生成以下样式 用鼠标拖动右下 ...
- sourceTree安装与使用
1,下载并安装 sourceTree http://downloads.atlassian.com/software/sourcetree/windows/SourceTreeSetup_1.6.14 ...
- 调不尽的内存泄漏,用不完的Valgrind
调不尽的内存泄漏,用不完的Valgrind Valgrind 安装 1. 到www.valgrind.org下载最新版valgrind-X.X.X.tar.bz2 2. 解压安装包:tar –jxvf ...
- rhApp遇到的项目问题
1.如果有多人同时操作一个桌台的情况下,如何处理: 2.index页面点击清空的时候是否要把桌台一起清掉: 3.账单界面已结账的小单背景色是否需要和未结账的不同:
- 设置Firefox禁用js缓存
让firefox禁用缓存 让Firefox不再使用缓存网站开发时经常会有这样的疑问:为什么修改了代码,刷新了页面还是没有看到改动呢? 其实,可能只是你的Firefox并没有去下载你更新了的文件. 这时 ...
- 使用Protel99 SE 拼板的详细图解(新加队列粘贴方法)
很多网友跟我沟通,提到我上次博文中的protel99se中做拼板图解过于简略,应大家的有求,重新修改了操作图示. 首先打开PCB文档.如图所示:电路板的原点并没有在边上,为了操作方便和规范,先把有点设 ...