分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 代码编程

hibernate中配置单向多对一关联,和双向一对多

发布时间:2023-09-06 02:23责任编辑:蔡小小关键词:配置

 什么是一对多,多对一?双向多对一和双向一对多是不是同一个概念?

  是一个概念,双向多对一和双向一对多都是配置一个 一对多和多对一

  一对多,比如你去找一个父亲的所有孩子,孩子可能有两个,三个甚至四个孩子. 这就是一对多 父亲是1 孩子是多

    多对一,比如你到了两个孩子,它们都是有一个共同的父亲. 此时孩子就是多 父亲是1

  

 总结:

  •   一对多就是: 1找到n
  •   多对一就是: n找到1

 有些人写概念写一大堆搞起我之前是一脸懵逼,还好弄懂了(手动滑稽)

配置单向多对一

  通过上面我们可以了解,双向一对多是 1找n,因为区县有总有很多街道,虽然有的街道没有名字(滑稽),下面我将拿街道和区县举例,实体类的getset我就省略了

   //编号 ???private Integer id; ???//街道名称 ???private String name; ???//所属区县编号 ???private Integer district_Id; ???//所属区县 ???private District district;

因为要找所属区县,所以就增加了一个类类型的变量. 

<!DOCTYPE hibernate-mapping PUBLIC ???????"-//Hibernate/Hibernate Mapping DTD 3.0//EN" ???????"E:/codeIdea/hibernate_config/hibernate-mapping-3.0.dtd"><hibernate-mapping> ????<class name="cn.pojo.Street" table="street"> ???????<id name="id" column="id" type="java.lang.Integer"> ???????????<!--设置主键自动增长就不多说了--> ???????????<generator class="increment"/> ???????</id> ???????<property name="name" type="string" column="name"/> ???????<!-- ???????????关联查询District类 ???????????name是指Street类中的district属性 ???????????column是指district表中外键 ???????????class这个就不用多说了 District实体类的路径 ???????????cascade的save-update表示 对街道进行添加或更新时会对 县区进行添加或更新 ????????--> ???????<many-to-one name="district" ????????????????????column="district_Id" ????????????????????class="cn.pojo.District" ????????????????????cascade="save-update"/> ???</class></hibernate-mapping>

我们来看下配置完后是否可以查询到区县

dao层

public Street findDistrct(Serializable id){ ???????return (Street)HibernateUtil.currentSession().get(Street.class,id); ???}

service层

  public Street getStreet(Integer id){ ???????Transaction tx=null; ???????Street streets=null; ???????try { ???????????tx=HibernateUtil.currentSession().beginTransaction(); ???????????//获取持久对象 注意这里没 commit() 因为延迟加载的原因所以没有commit ???????????streets = street.findDistrct(id); ???????} catch (HibernateException e) { ???????????e.printStackTrace(); ???????????if(tx!=null) ???????????????tx.rollback(); ???????} ???????return streets; ???}

测试

StreetServiceImpl streetService = new StreetServiceImpl();System.out.println(streetService.getStreet(1001).getDistrict().getName());

结果:

配置双向一对多

实体类属性 多了一个set因为是 1找n 所以是一个set因为set不允许重复值

 ???//编号 ???private Integer id; ???//区县名称 ???private String name; ???//街道 ???private Set<Street> streetSet;

双向多对一就是在上面的基础上加了个一对多即成了双向, 

<!DOCTYPE hibernate-mapping PUBLIC ???????"-//Hibernate/Hibernate Mapping DTD 3.0//EN" ???????"E:/codeIdea/hibernate_config/hibernate-mapping-3.0.dtd"><hibernate-mapping> ???<class name="cn.pojo.District" table="district" schema="scott"> ???????<id name="id" column="id" type="java.lang.Integer"> ???????????<!--设置自动增长不多讲了--> ???????????<generator class="increment"/> ???????</id> ???????<property name="name" type="string" column="name"/> ???????<!-- ???????????name同上 ?????????????inverse默认false ?是否将对集合对象的修改反映到数据库中 false自己控制,true对方控制 ????????????key 是street表中的外键 ???????????class同上 ???????--> ???????<set name="streetSet" inverse="true"> ???????????<key column="district_Id"/> ???????????<one-to-many class="cn.pojo.Street"/> ???????</set> ???</class></hibernate-mapping>

配置完1找n后我们再来查询下

dao层

public District getDistrct(Integer id){ ???????return (District)HibernateUtil.currentSession().get(District.class,id); ???}

service层

public Set<Street> findStreet(Integer id){ ???????Transaction tx=null; ???????Set<Street> streets=null; ???????try { ???????????tx=HibernateUtil.currentSession().beginTransaction(); ???????????//得到持久状态的对象 ???????????District distrct = distrctDao.getDistrct(id); ???????????//得到set ???????????streets=distrct.getStreetSet(); ???????} catch (HibernateException e) { ???????????e.printStackTrace(); ???????????if(tx!=null) ???????????????tx.rollback(); ???????} ???????return streets; ???}

测试

DistrctServiceImpl ds = new DistrctServiceImpl();Iterator<Street> streetIter = ds.findStreet(1004).iterator();while (streetIter.hasNext()){ ???System.out.println(streetIter.next().getName());}

数据库的数据

结果

对双向一对读关联进行更新

dao 层

  public Street findDistrct(Serializable id){ ???????return (Street)HibernateUtil.currentSession().get(Street.class,id); ???}

service层 这里为了快点就没传参了 直接调用即可

public void updateStreet(){ ???Transaction tx=null; ???try { ???????//打开事务 ???????tx=HibernateUtil.currentSession().beginTransaction(); ???????//获得持久层对象 ???????Street streets = street.findDistrct(1000); ???????//对区县进行修改 ???????streets.getDistrict().setName("京城"); ???????//提交事务 ???????tx.commit(); ???} catch (HibernateException e) { ???????e.printStackTrace(); ???????if(tx!=null) ???????????tx.rollback(); ???}}

我们来看看数据库没运行之前

运行之后 可以看到 知春路所属的区县改变了

hibernate中配置单向多对一关联,和双向一对多

原文地址:https://www.cnblogs.com/hfx123/p/9997903.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved