hibernate中配置单向多对一关联,和双向一对多
Posted hfx123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hibernate中配置单向多对一关联,和双向一对多相关的知识,希望对你有一定的参考价值。
什么是一对多,多对一?双向多对一和双向一对多是不是同一个概念?
是一个概念,双向多对一和双向一对多都是配置一个 一对多和多对一
一对多,比如你去找一个父亲的所有孩子,孩子可能有两个,三个甚至四个孩子. 这就是一对多 父亲是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中配置单向多对一关联,和双向一对多的主要内容,如果未能解决你的问题,请参考以下文章