hibernate初探之单向一对多映射
来源:互联网 发布:知乎 国开博裕和博裕 编辑:程序博客网 时间:2024/05/21 12:42
什么叫做单向一对多的映射呢?
我们首先要知道映射是有方向的,分为单向和双向。
比如班级和学生。站在班级的角度,一个班级可以有多个学生, 在这里班级就是“一”方 学生就是“多”方
这种关系就是一对多的关系,如果只站在班级的角度,那就是单向的一对多的关系。
一对多的关系我们应该怎么实现呢?
在数据库中我们会通过主外键的方式实现,在多学生表中添加一个外键指向班级
在hibernate中我们会通过在“一”的一方使用<set>元素表示持有“多”的一方的对象,即在“一”方中使用集合 表示持有“多”方
使用工具
- Junint单元测试工具
- mysql-connector-java-5.1.7-bin.jar
- hibernate 4.2.4.jar
hibernate配置文件
<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><!-- Generated by MyEclipse Hibernate Tools. --><hibernate-configuration><session-factory><property name="dialect">org.hibernate.dialect.MySQLDialect</property><property name="connection.url">jdbc:mysql://localhost:3306/susu</property><property name="connection.username">root</property><property name="connection.password">123</property><property name="connection.driver_class">com.mysql.jdbc.Driver</property><property name="myeclipse.connection.profile">MySQLDriver</property><property name="show_sql">true</property><property name="format_sql">true</property><property name="hbm2ddl.auto">create</property><mapping resource="com/scx/entity/Grade.hbm.xml" /><mapping resource="com/scx/entity/Students.hbm.xml" /></session-factory></hibernate-configuration>因为我们还没有在数据库中创建表 所以要在hibernate配置文件设置
<property name="hbm2ddl.auto">create</property>
持久化类
students 学生类
package com.scx.entity;public class Students {//学生主键private int sId;//学生姓名private String sName;//学生性别private String sex;//学生年龄private int age;public Students(int sId, String sName, String sex, int age) {this.sId = sId;this.sName = sName;this.sex = sex;this.age = age;}public Students() {}public int getsId() {return sId;}public void setsId(int sId) {this.sId = sId;}public String getsName() {return sName;}public void setsName(String sName) {this.sName = sName;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}
grade 班级类
package com.scx.entity;import java.util.HashSet;import java.util.Set;public class Grade {//班级主键private int gId;//班级名称private String gName;//学生集合private Set<Students> students = new HashSet<Students>();public Grade(int gId, String gName, Set<Students> students) {this.gId = gId;this.gName = gName;this.students = students;}public Grade() {}public int getgId() {return gId;}public void setgId(int gId) {this.gId = gId;}public String getgName() {return gName;}public void setgName(String gName) {this.gName = gName;}public Set<Students> getStudents() {return students;}public void setStudents(Set<Students> students) {this.students = students;}//向班级中集合中添加学生public void addStudents(Students stu) {students.add(stu);}}对象关系映射文件
Students.hbm.xml
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Mapping file autogenerated by MyEclipse Persistence Tools--><hibernate-mapping> <class name="com.scx.entity.Students" table="students" catalog="hibernate"> <id name="sId" type="java.lang.Integer"> <column name="SID" /> <generator class="native" /> </id> <property name="sName" type="java.lang.String"> <column name="SNAME" length="20" /> </property> <property name="sex" type="java.lang.String"> <column name="SEX" length="2" /> </property> <property name="age" type="java.lang.Integer"> <column name="AGE" /> </property> </class></hibernate-mapping>Grade.hbm.xml
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Mapping file autogenerated by MyEclipse Persistence Tools--><hibernate-mapping> <class name="com.scx.entity.Grade" table="grade" catalog="hibernate"> <id name="gId" type="java.lang.Integer"> <column name="GID" /> <generator class="native" /> </id> <property name="gName" type="java.lang.String"> <column name="GNAME" length="20" /> </property> <!-- 配置单向的一对多关联关系 --> <set name="students" table="students"> <!-- 制定关联的外键列 --> <key column="GID"></key> <!-- 持久化对象所对应的实体类 --> <one-to-many class="com.scx.entity.Students"/> </set> </class></hibernate-mapping>
注意看 在Grade.hbm.xml中我们需要配置单向的一对多关联关系
<set name="students" table="students"> <!-- 制定关联的外键列 --> <key column="GID"></key> <!-- 持久化对象所对应的实体类 --> <one-to-many class="com.scx.entity.Students"/> </set>
使用junit通过Hibernate API编写访问数据库的代码
import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.hibernate.service.ServiceRegistry;import org.hibernate.service.ServiceRegistryBuilder;import org.junit.After;import org.junit.Before;import com.scx.entity.Grade;import com.scx.entity.Students;public class Test {private Configuration config;private ServiceRegistry serviceRegistry;private SessionFactory sessionFactory;private Session session;private Transaction transaction;@Beforepublic void init() {//创建配置对象config = new Configuration().configure();//创建服务注册对象serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();//创建会话工厂对象sessionFactory=config.buildSessionFactory(serviceRegistry);//会话对象session=sessionFactory.openSession();//开启事务transaction=session.beginTransaction();}@Afterpublic void destroy(){transaction.commit();//提交事务session.close();//关闭会话sessionFactory.close();//关闭会话工厂}@org.junit.Testpublic void testSave(){Students stu1=new Students(1, "小明", "男", 15);Students stu2=new Students(2, "小红", "女", 15);Grade g1=new Grade();Grade g2=new Grade();g1.setgName("软件一班");g2.setgName("软件二班");g1.addStudents(stu1);g2.addStudents(stu2);session.save(g1);session.save(g2);session.save(stu1);session.save(stu2);}}
实例化了两个学生 两个班级 分别属于一个班级
运行结果如下:
根据班级查找班级所有学生
首先修改hibernate配置文件中的生成表策略为update
<property name="hbm2ddl.auto">update</property>
然后新添加一个测试
@org.junit.Testpublic void findStudentsByGrade(){Grade g=(Grade) session.get(Grade.class, 1);System.out.println(g.getgName());Set<Students> students=g.getStudents();for (Students stu : students) {System.out.println(stu.getsName()+" "+stu.getSex()+" "+stu.getAge());}}运行结果:
更新学生信息
@org.junit.Testpublic void update(){Grade g=new Grade();g.setgName("软件三班");Students stu=(Students) session.get(Students.class, 1);g.addStudents(stu);session.save(g);}新建一个班级为软件三班 并将编号为1的学生添加到软件三班
运行结果:
删除学生
@org.junit.Testpublic void delete(){Students stu=(Students) session.get(Students.class, 2);session.delete(stu);}查找编号为2的学生 并删除
运行结果如下:
2 0
- hibernate初探之单向一对多映射
- Hibernate映射一对多单向关联(之二)
- Hibernate映射一对多单向关联(之三)
- 【Hibernate步步为营】--(一对多映射)之单向关联
- 【Hibernate步步为营】--(一对多映射)之单向关联
- Hibernate进阶之单向一对多关系映射
- hibernate之关于一对多单向关联映射
- 【Hibernate步步为营】--(一对多映射)之单向关联
- 【Hibernate步步为营】--(一对多映射)之单向关联
- Hibernate之单向一对多映射(使用maven构建)
- Hibernate单向一对多映射和双向一对多映射
- Hibernate一对多单向关联映射
- Hibernate映射一对多单向关联(之一)
- Hibernate一对多关联映射—单向
- hibernate一对多关联映射—单向
- hibernate学习笔记【一对多单向映射】
- HIbernate关系映射--单向一对多@OneToMany
- hibernate一对多关联映射—单向
- Android开发 四大组件是否运行在主线程中?
- memcpy和memmove的区别
- networkD3包
- Spring源码分析之ioc容器第二天之oC容器在Web容器中的启动
- 在ec2上部署spark-部署成功后无法启动
- hibernate初探之单向一对多映射
- LayoutInflate源码分析之如何解析视图树
- android实现应用程序前台和后台之间转换的监听的两种方式
- 特征工程--笔记
- 博客第一天
- 简单计算器-界面实现
- jp.ne.so_net.ga2.no_ji.jcom.JComException: createInstance() failed HRESULT=0x800401F3L
- redis集合set操作
- secureCRT连接虚拟机与使用设置