单向的一对多关联
创建对应的实体类以及映射文件
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文件中 配置映射文件
测试类
package cn.bdqn.test; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.junit.After; import org.junit.Before; import org.junit.Test; import cn.bdqn.bean.District; import cn.bdqn.bean.Street; public class StreetTest { Configuration configuration = null; SessionFactory sessionFactory = null; Session session = null; Transaction transaction = null; // 测试方法有相同的代码块 @Before public void before() { // 01.加载配置文件(hibernate.cfg.xml) 必须位于src的根目录下 configuration = new Configuration().configure(); // 02.创建会话工厂 设置成单例模式 sessionFactory = configuration.buildSessionFactory(); // 03.通过工厂创建会话session HttpSession(用户session) session = sessionFactory.openSession(); // 04.利用面向对象的思想来操作数据库 增删改都必须开启事务 transaction = session.beginTransaction(); } @After //关闭session public void after(){ //查询中没有session 做非空验证 if (session!=null) { // 05.关闭session session.close(); } } //01.新增街道的同时,给街道对应的区县赋值 @Test public void test01(){ //创建一个街道 Street street=new Street(1005, "王府井"); //从数据库中获取一个区县 District district=(District) session.load(District.class, 1001); //给街道赋值 区县 street.setDistrict(district); //不会产生select语句 //保存街道 session.save(street); transaction.commit(); } //02.修改街道对应的区县 @Test public void test02(){ //从数据库中获取一个区县 District district=(District) session.load(District.class, 1001); //从数据库中获取一个需要修改的街道 Street street=(Street) session.load(Street.class, 1005); System.out.println("街道原来的区县===》"+street.getDistrict().getName()); //开始修改街道的区县 street.setDistrict(district); System.out.println("街道现在的区县===》"+street.getDistrict().getName()); /** * session.update(street); * 这里不需要save或者update * 因为commit执行flush--》缓存清理----》脏检查 */ transaction.commit(); } //03.删除街道对应的区县 @Test public void test03(){ //从数据库中获取一个街道 Street street=(Street) session.load(Street.class, 1005); System.out.println("街道原来的区县===》"+street.getDistrict().getName()); //开始删除街道的区县 street.setDistrict(null); // System.out.println("街道现在的区县===》"+street.getDistrict().getName()); 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 进行 降序排列 --> <bag name="streets"> <key column="districtId"/> <one-to-many class="Street"/> </bag> </class> </hibernate-mapping>
在测试类中增加代码
/** * 设置完 一对多 关联关系 * 01.查询指定1001区县下面的所有街道,并按照街道id 降序排列 * 需要在bag 节点上增加 order-by="id desc" */ @Test public void test04(){ //获取指定区县的信息 District district=(District) session.load(District.class, 1001); //获取区县下面所有的街道 List<Street> streets = district.getStreets(); for (Street street : streets) { System.out.println(street); } } // 使用hql 解决上面查询的问题 @Test public void test05(){ String hql="from Street s where districtId=:id order by s.id desc"; Query query = session.createQuery(hql); //设置参数 query.setParameter("id", 1001); List<Street> list = query.list(); for (Street street : list) { System.out.println(street); } }
原文:http://www.cnblogs.com/999-/p/6404243.html