单向的一对多关联

创建对应的实体类以及映射文件

package cn.bdqn.bean;
/**
*
* @author 小豆腐
*街道对应的实体类
*
*单向的多对一关联
*/
public class Street { private Integer id;
private String name;
//多个街道 属于 一个区县
private District district; //对应的区县 public District getDistrict() {
return district;
}
public void setDistrict(District district) {
this.district = district;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Street(Integer id, String name) {
super();
this.id = id;
this.name = name;
}
public Street() {
super();
}
@Override
public String toString() {
return "Street [id=" + id + ", name=" + name + "]";
} }
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.bdqn.bean">
<class name="Street">
<id name="id">
<generator class="assigned"/><!-- 手动给主键赋值 -->
</id>
<property name="name"/>
<!-- 配置多对一关联
name:对应的是 本类中 关联关系的属性名
column:对应数据库中 两个表的 外键!
class:关联的实体类-->
<many-to-one name="district" column="districtId" class="District"/>
</class>
</hibernate-mapping>
package cn.bdqn.bean;
/**
* @author 小豆腐
*
*区县的实体类
*/
public class District { private Integer id;
private String name; public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public District(Integer id, String name) {
super();
this.id = id;
this.name = name;
}
public District() {
super();
}
@Override
public String toString() {
return "Street [id=" + id + ", name=" + name + "]";
} }
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.bdqn.bean">
<class name="District">
<id name="id">
<generator class="assigned"/><!-- 手动给主键赋值 -->
</id>
<property name="name"/>
</class>
</hibernate-mapping>

需要在hibernate.cfg.xml文件中 配置映射文件

测试类

        Session session=null;
Transaction transaction=null; //获取session 开启事务
@Before
public void before(){
session=HibernateSessionUtil.getCurrentSession();
transaction= session.beginTransaction();
} /**
* 测试单向的多对一的关联
*
* 创建对应的区县 新增几个区县 以备后续使用
*/
@Test
public void testAdd(){
District district=new District(3, "区县3");
session.save(district); //保存
transaction.commit(); //提交事务
} //新增 街道的同时 给街道对应的区县赋值
@Test
public void test01(){
//创建一个街道
Street street=new Street();
street.setId(1);
street.setName("街道1");
//给对应的区县赋值
District district= (District) session.load(District.class, 1);
street.setDistrict(district);
session.save(street); //保存
transaction.commit(); //提交事务 只会产生一条sql insert
} //修改 街道对应的区县
@Test
public void test02(){
//从数据库中获取一个街道
Street street=(Street) session.load(Street.class, 1); // 对应的区县是1
District district=(District) session.load(District.class, 2); // 区县是2
//修改
street.setDistrict(district); // 不需要 update 因为两个对象都是持久化对象
//提交事务
transaction.commit();
} //删除 街道对应的区县
@Test
public void test03(){
//从数据库中获取一个街道
Street street=(Street) session.load(Street.class, 1); // 对应的区县是2
//修改
street.setDistrict(null);
//提交事务
transaction.commit();
}

双向的一对多关联就是在单向多对一的基础上增加一个单向的一对多!

修改District代码 一对多关联

package cn.bdqn.bean;

import java.util.ArrayList;
import java.util.List; /**
* @author 小豆腐
*
*区县的实体类
* 一对多的关联关系
*/
public class District { private Integer id;
private String name;
// 一个区县 有 多个街道
private List<Street> streets=new ArrayList<>(); public List<Street> getStreets() {
return streets;
}
public void setStreets(List<Street> streets) {
this.streets = streets;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public District(Integer id, String name) {
super();
this.id = id;
this.name = name;
}
public District() {
super();
}
@Override
public String toString() {
//如果写成streets 会出现 堆栈溢出的异常!
return "District [id=" + id + ", name=" + name + ", streets=" + streets.size()
+ "]";
} }

修改District.hbm.xml文件代码

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.bdqn.bean">
<class name="District">
<id name="id">
<generator class="assigned"/><!-- 手动给主键赋值 -->
</id>
<property name="name"/>
<!-- 设置一对多
name:本类中的关联属性名 集合的名称
column: 就是数据库表中的外键
order-by="id desc" 按照 街道的id 进行 降序排列
inverse:是由谁来维护表与表之间的关系! 默认是false!(维护) true(不维护)
-->
<bag name="streets" cascade="all" inverse="true">
<key column="districtId"/>
<one-to-many class="Street"/>
</bag>
</class>
</hibernate-mapping>

在测试类中增加代码

    /**
* 创建几个街道 测试 双向的一对多关联
*/
@Test
public void test04(){
Street street=new Street();
street.setId(4);
street.setName("街道4");
//给对应的区县赋值
District district= (District) session.load(District.class, 1);
street.setDistrict(district);
session.save(street); //保存
//提交事务
transaction.commit();
} //根据区县 获取所管辖的街道
@Test
public void test05(){
District district=(District) session.load(District.class, 1);
List<Street> streets = district.getStreets();
for (Street street : streets) {
System.out.println(street);
}
}
/**
* 根据区县 获取所管辖的街道 根据街道的编号 降序排列
* 01.只需要在 bag节点中 增加 order-by属性 = id desc
*/
@Test
public void test06(){
District district=(District) session.load(District.class, 1);
List<Street> streets = district.getStreets();
for (Street street : streets) {
System.out.println(street);
}
}
/**
* 02.使用hql语句
*/
@Test
public void test07(){
String hql="from Street s where districtId=:id order by s.id desc";
//创建query对象
Query query = session.createQuery(hql);
//给参数赋值
query.setParameter("id", 1); //区县编号是1
//遍历结果集
List<Street> list = query.list();
for (Street street : list) {
System.out.println(street);
}
} /**
* cascade属性:定义的是关系两端 对象到对象的级联关系!
* 必须是 双向的一对多关联!
*
* 常用的属性值:
* 01.none:默认值!当session操作当前对象的时候,忽略关联的属性!
* 02.save-update:当session调用save,saveorUpdate以及update()的时候!
* 会级联的保存和修改当前对象以及对象关联的属性!
* 001.去区县的xml文件中 的 bag节点 增加 cascade属性!
* 002.直接运行以下代码
* 03.delete: 当session调用 delete()的时候,会级联删除所关联的对象 !
* 04.all: 包括了save-update和delete!
*
* 添加区县的同时 添加街道
*/
@Test
public void test08(){
//创建区县
District district=new District(4, "区县4");
//创建街道
Street street1=new Street(5, "街道5");
Street street2=new Street(6, "街道6");
Street street3=new Street(7, "街道7");
//给区县的街道赋值
district.getStreets().add(street1);
district.getStreets().add(street2);
district.getStreets().add(street3);
//保存区县
session.save(district); //发现 保存了 区县 但是 没有保存对应的街道!
transaction.commit();
/**
* 程序执行之后的结果:
* Hibernate: insert into District (name, id) values (?, ?)
Hibernate: update Street set districtId=? where id=?
Hibernate: update Street set districtId=? where id=?
Hibernate: update Street set districtId=? where id=?
*/ /**
* 在xml文件中设置了 cascade="save-update" 之后的结果
*
* 问题:虽然级联保存成功了!
* 但是有多余update语句!
* 为什么会出现多余的? 两个对象都在维护彼此之间的关系!
*
* Hibernate: select street_.id, street_.name as name1_, street_.districtId as districtId1_ from Street street_ where street_.id=?
Hibernate: select street_.id, street_.name as name1_, street_.districtId as districtId1_ from Street street_ where street_.id=?
Hibernate: select street_.id, street_.name as name1_, street_.districtId as districtId1_ from Street street_ where street_.id=?
Hibernate: insert into District (name, id) values (?, ?)
Hibernate: insert into Street (name, districtId, id) values (?, ?, ?)
Hibernate: insert into Street (name, districtId, id) values (?, ?, ?)
Hibernate: insert into Street (name, districtId, id) values (?, ?, ?)
Hibernate: update Street set districtId=? where id=?
Hibernate: update Street set districtId=? where id=?
Hibernate: update Street set districtId=? where id=?
*/
} /**
* cascade="delete" xml中的配置
* 删除 区县 的同时 删除 街道!
*/
@Test
public void test09(){
District district= (District) session.load(District.class, 1);
//获取三个街道
Street street1= (Street) session.load(Street.class, 2);
Street street2= (Street) session.load(Street.class, 3);
Street street3= (Street) session.load(Street.class, 4);
session.delete(district);
transaction.commit();
/**
* Hibernate: update Street set districtId=null where districtId=?
Hibernate: delete from Street where id=?
Hibernate: delete from Street where id=?
Hibernate: delete from Street where id=?
Hibernate: delete from District where id=?
*/
} /**
* 针对于 多余的sql语句 解决办法!
*
* 只需要一方来维护表之间的关系!
* inverse属性:
* 01.默认是false(由我维护!)
* 02.inverse=true:这一方不维护关系!(不与数据库交互)
*
*
* 不能都维护,也不能都 不维护! 这个时候关键是谁来维护这个关系?
* 双向的一对多!
* hibernate:规定多的一端来维护关系,那么必须在一的一方设置 inverse=true:
*/
@Test
public void test10(){
//创建区县
District district=new District(4, "区县4");
//创建街道
Street street1=new Street(5, "街道5");
Street street2=new Street(6, "街道6");
Street street3=new Street(7, "街道7");
//给区县的街道赋值
district.getStreets().add(street1);
district.getStreets().add(street2);
district.getStreets().add(street3);
//保存区县
session.save(district); //发现 保存了 区县 但是 没有保存对应的街道!
transaction.commit();
/**
*
* 发现 没有了 update语句!
* Hibernate: select street_.id, street_.name as name1_, street_.districtId as districtId1_ from Street street_ where street_.id=?
Hibernate: select street_.id, street_.name as name1_, street_.districtId as districtId1_ from Street street_ where street_.id=?
Hibernate: select street_.id, street_.name as name1_, street_.districtId as districtId1_ from Street street_ where street_.id=?
Hibernate: insert into District (name, id) values (?, ?)
Hibernate: insert into Street (name, districtId, id) values (?, ?, ?)
Hibernate: insert into Street (name, districtId, id) values (?, ?, ?)
Hibernate: insert into Street (name, districtId, id) values (?, ?, ?)
*/
}

hibernate07--关联映射的更多相关文章

  1. Hibernatel框架关联映射

    Hibernatel框架关联映射 Hibernate程序执行流程: 1.集合映射 需求:网络购物时,用户购买商品,填写地址 每个用户会有不确定的地址数目,或者只有一个或者有很多.这个时候不能把每条地址 ...

  2. hibernate多对多关联映射

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  3. Hibernate一对多单向(双向)关联映射

    (1).编写配置文件 Hibernate通过读写默认的XML配置文件hibernate.cfg.xml加载数据库配置信息.代码如下: <hibernate-configuration> & ...

  4. Java三大框架之——Hibernate关联映射与级联操作

    什么是Hibernate中的关联映射? 简单来说Hibernate是ORM映射的持久层框架,全称是(Object Relational Mapping),即对象关系映射. 它将数据库中的表映射成对应的 ...

  5. Hibernate关联映射 映射文件的配置

    一:多对一单向关联 首先我们必须创建两个实体类 例如:Dept类 public class Dept { private Integer deptNo; private String dName; p ...

  6. Hibernate组件和关联映射

    一.基本定义 组件:建立一个类,为了方便代码复用和建立模型,但类在数据库中并没有对应的表,此类可以作为一个组件插入到其他类中(有数据表的类) 组件和关联映射的关系是组件是没有对应的类;组件是值类型的, ...

  7. 【Hibernate框架】关联映射(多对多关联映射)

    按着我们的总结行进计划,接下来,就是有关于多对多映射的总结了. 我们来举个例子啊,很长时间以来,房价暴涨不落,但是还有很多人拥有很多套房产,假如说,一个富豪拥有九套房产,家里人么准去住哪一套,我们就以 ...

  8. 【Hibernate框架】关联映射(一对多,多对一)

    根据我们的总结计划,上篇文章我们总结了有关于一对一映射相关知识,接下来,我们进行下一个阶段,一对多.多对一映射相关知识. 场景设定: 国家规定,一个人只能在一个公司上班,一个公司可以拥有很多员工.我们 ...

  9. 【Hibernate框架】关联映射(一对一关联映射)

    一.整理思路: 之前,小编总结过Mybatis的关联映射,接下来,再来总结一下hibernate的相关的关联映射,直接上图: 这张图,就是小编整理总结整个Hibernate的关联映射的一个大致思路. ...

  10. Hibernate注解----关联映射注解以及课程总结详解----图片版本

    上一篇,记录了Hibernate注解----类级别注解以及属性注解详解 ,我们这一节主要讲解的是Hibernate注解----关联映射注解以及课程总结详解. 本节的主要内容: 第3章 关联映射注解 3 ...

随机推荐

  1. shell之磁盘容量检查,配合crontab可以定时清理磁盘

    我的做法: !/bin/bashAvailable=`df -k | sed -n 2p | awk '{print $4}'`if [ $Available -eq 0 ];then        ...

  2. JSOUP 超时分析与处理

    JSOUP 超时分析与处理 下面说说超时的发现,有可能出现超时的原因,以及超时处理. 1.请求头信息得一致 当你捕获到一个采用JSOUP 去请求超时的链接,我是通过catch 去发现. try{ do ...

  3. Kubernetes中的Configmap和Secret

    本文的试验环境为CentOS 7.3,Kubernetes集群为1.11.2,安装步骤参见kubeadm安装kubernetes V1.11.1 集群 应用场景:镜像往往是一个应用的基础,还有很多需要 ...

  4. Centos yum国内源及配置含义

    Centos yum源的位置: /etc/yum.repos.d,可以通过配置文件/etc/yum.conf指定其他位置 主要的yum源种类:前两个是必须的,不然yum安装很多软件时会失败.yum本来 ...

  5. 具有相同名称 的类/接口已在使用。请使用类定制设置来解决此冲突。java调用第三方的webservice应用实例

    WSDLToJava Error: http://10.96.84.124:81/BTRPWebServiceForSMB/OnSMBOrderService.svc?xsd=xsd0 [0,0]: ...

  6. bootstrap-实现loading效果

    可以使用bootstrap的模态框(modal.js),使用它我们可以做出loading效果. html <!-- loading --> <div class="moda ...

  7. 第六周周赛——AK机会不易得,好好把握题解(出自HDU5650,codeforces 616A,624A,659A,655A,658A)

    A题: A题题目链接 题目描写叙述: 位运算 TimeLimit:1000MS  MemoryLimit:65536KB 64-bit integer IO format:%I64d Problem ...

  8. Centos7中离线安装DockerCE最新版

    一.简述 离线在Centos7中部署DockerCE. 二.步骤 (1)在有外网的计算A上执行: 1.配置安装源存放路径 mkdir -p /root/docker-ce-local &&am ...

  9. wait-for

    Use a tool such as wait-for-it, dockerize, or sh-compatible wait-for. These are small wrapper script ...

  10. Python 3安装MySQLdb

    Python 2安装的是mysql-python,Python 3安装mysql-python以后,仍然不能import MySQLdb,原来Python 3应该安装mysqlclient,就可以im ...