网站建设项目确认书,海南建设培训网站,浏览国外网站dns,wordpress 列表分类链接 v1.3单向的一对多关联 创建对应的实体类以及映射文件 package cn.bdqn.bean;
/*** * author 小豆腐*街道对应的实体类**单向的多对一关联*/
public class Street {private Integer id;private String name;//多个街道 属于 一个区县private District district; //对应的区县p…单向的一对多关联 创建对应的实体类以及映射文件 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();}Overridepublic String toString() {return Street [id id , name name ];}} ?xml version1.0?
!DOCTYPE hibernate-mapping PUBLIC-//Hibernate/Hibernate Mapping DTD 3.0//ENhttp://www.hibernate.org/dtd/hibernate-mapping-3.0.dtdhibernate-mapping packagecn.bdqn.beanclass nameStreetid nameid generator classassigned/!-- 手动给主键赋值 --/id property namename/!-- 配置多对一关联name:对应的是 本类中 关联关系的属性名column:对应数据库中 两个表的 外键class:关联的实体类--many-to-one namedistrict columndistrictId classDistrict/ /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();}Overridepublic String toString() {return Street [id id , name name ];}} ?xml version1.0?
!DOCTYPE hibernate-mapping PUBLIC-//Hibernate/Hibernate Mapping DTD 3.0//ENhttp://www.hibernate.org/dtd/hibernate-mapping-3.0.dtdhibernate-mapping packagecn.bdqn.beanclass nameDistrictid nameid generator classassigned/!-- 手动给主键赋值 --/id property namename//class
/hibernate-mapping 需要在hibernate.cfg.xml文件中 配置映射文件 测试类 Session sessionnull;Transaction transactionnull;//获取session 开启事务Beforepublic void before(){sessionHibernateSessionUtil.getCurrentSession();transaction session.beginTransaction();}/*** 测试单向的多对一的关联* * 创建对应的区县 新增几个区县 以备后续使用*/Testpublic void testAdd(){District districtnew District(3, 区县3);session.save(district); //保存transaction.commit(); //提交事务}//新增 街道的同时 给街道对应的区县赋值Testpublic void test01(){//创建一个街道Street streetnew 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}//修改 街道对应的区县 Testpublic void test02(){//从数据库中获取一个街道Street street(Street) session.load(Street.class, 1); // 对应的区县是1District district(District) session.load(District.class, 2); // 区县是2//修改street.setDistrict(district); // 不需要 update 因为两个对象都是持久化对象//提交事务transaction.commit();}//删除 街道对应的区县 Testpublic 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 ListStreet streetsnew ArrayList();public ListStreet getStreets() {return streets;}public void setStreets(ListStreet 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();}Overridepublic String toString() {//如果写成streets 会出现 堆栈溢出的异常return District [id id , name name , streets streets.size() ];}} 修改District.hbm.xml文件代码 ?xml version1.0?
!DOCTYPE hibernate-mapping PUBLIC-//Hibernate/Hibernate Mapping DTD 3.0//ENhttp://www.hibernate.org/dtd/hibernate-mapping-3.0.dtdhibernate-mapping packagecn.bdqn.beanclass nameDistrictid nameid generator classassigned/!-- 手动给主键赋值 --/id property namename/!-- 设置一对多 name:本类中的关联属性名 集合的名称column: 就是数据库表中的外键order-byid desc 按照 街道的id 进行 降序排列inverse是由谁来维护表与表之间的关系 默认是false维护 true不维护--bag namestreets cascadeall inversetruekey columndistrictId/one-to-many classStreet//bag/class
/hibernate-mapping 在测试类中增加代码 /*** 创建几个街道 测试 双向的一对多关联*/Testpublic void test04(){Street streetnew Street();street.setId(4);street.setName(街道4);//给对应的区县赋值District district (District) session.load(District.class, 1);street.setDistrict(district);session.save(street); //保存//提交事务transaction.commit();}//根据区县 获取所管辖的街道Testpublic void test05(){District district(District) session.load(District.class, 1);ListStreet streets district.getStreets();for (Street street : streets) {System.out.println(street);}}/*** 根据区县 获取所管辖的街道 根据街道的编号 降序排列* 01.只需要在 bag节点中 增加 order-by属性 id desc*/Testpublic void test06(){District district(District) session.load(District.class, 1);ListStreet streets district.getStreets();for (Street street : streets) {System.out.println(street);}}/*** 02.使用hql语句*/Testpublic void test07(){String hqlfrom Street s where districtId:id order by s.id desc;//创建query对象Query query session.createQuery(hql);//给参数赋值query.setParameter(id, 1); //区县编号是1//遍历结果集ListStreet 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* * 添加区县的同时 添加街道*/Testpublic void test08(){//创建区县District districtnew District(4, 区县4);//创建街道Street street1new Street(5, 街道5);Street street2new Street(6, 街道6);Street street3new 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文件中设置了 cascadesave-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?*/}/*** cascadedelete xml中的配置* 删除 区县 的同时 删除 街道*/Testpublic 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 districtIdnull 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.inversetrue:这一方不维护关系不与数据库交互* * * 不能都维护也不能都 不维护 这个时候关键是谁来维护这个关系* 双向的一对多 * hibernate:规定多的一端来维护关系那么必须在一的一方设置 inversetrue:*/Testpublic void test10(){//创建区县District districtnew District(4, 区县4);//创建街道Street street1new Street(5, 街道5);Street street2new Street(6, 街道6);Street street3new 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 (?, ?, ?)*/} 转载于:https://www.cnblogs.com/HHR-SUN/p/7190791.html