注意这里使用hibernate4.3.11的jar包
映射类型:
一对多(one-to-many)
多对一(many-to-one)
一对一(one - to -one)
多对多(many-to-many)
常用的是一对多和多对一的映射
下面学习一对多映射类型
比如:一个班级有多个学生
在数据库中:可以通过添加主外键的关联(学生表中添加外键指向班级),表现一对多的关系
在Hibernate和java中:通过一方持有多方的集合实现,即在“一”的一端使用<set>元素表示持有“多”的
一端的对象(即通过集合的方式)
注意这里使用hibernate4.3.11的jar包
创建Hibernate的工具类:
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static SessionFactory sessionFactory;
private static Session session;
static{
//创建Configuration 读取hibernate.cfg.xml文件,完成初始化
Configuration config = new Configuration().configure();
StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder().applySettings(config.getProperties());
StandardServiceRegistry ssr = ssrb.build();
sessionFactory = config.buildSessionFactory(ssr);
}
//获取SessionFactory
public static SessionFactory getSessionFactory(){
return sessionFactory;
}
//获取session
public static Session getSession(){
session = sessionFactory.openSession();
return session;
}
//关闭session
public static void closeSession(Session session){
if(session!=null){
session.close();
}
}
}
下面是使用sql语句创建表的方式(没兴趣的请跳过)。可以使用Hibernate tools工具自动生成,还是hibernate tools工具比较爽
学点mysql语句:如下的sql语句是创建班级表grade和学生表student,最后一句
alter table student add constraint fk_student_gid foreign key (gid)
references grade(gid);
是给学生表添加外键gid对应主表grade表的主键gid。其中fk_student_gid是外键的名字
create table grade
(
gid int primary key,
gname varchar(20) not null,
gdesc varchar(50)
);
create table student
(
sid int primary key,
sname varchar(20) not null,
sex char(2),
gid int
);
alter table student add constraint fk_student_gid foreign key (gid)
references grade(gid);
使用sqlyog管理工具执行上面的sql语句创建表
执行sql语句创建成功
创建学生类:
package com.edu.hpu.model;
public class Student {
private int sid;
private String sname;
private String sex;
public Student(){
}
public Student(String sname, String sex) {
super();
this.sname = sname;
this.sex = sex;
}
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;
}
}
创建班级类
package com.edu.hpu.model;
import java.util.HashSet;
import java.util.Set;
public class Grade {
private int gid;
private String gname;
private String gdesc;//班级详细信息
//在一方定义一个多方的集合
private Set<Student> students = new HashSet<Student>();
public Grade() {
super();
}
public Grade( String gname, String gdesc) {
super();
this.gname = gname;
this.gdesc = gdesc;
}
public Grade(int gid, String gname, String gdesc, Set<Student> students) {
super();
this.gid = gid;
this.gname = gname;
this.gdesc = gdesc;
this.students = students;
}
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
return super.equals(obj);
}
@Override
protected void finalize() throws Throwable {
// TODO Auto-generated method stub
super.finalize();
}
@Override
public int hashCode() {
// TODO Auto-generated method stub
return super.hashCode();
}
@Override
public String toString() {
// TODO Auto-generated method stub
return super.toString();
}
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 String getGdesc() {
return gdesc;
}
public void setGdesc(String gdesc) {
this.gdesc = gdesc;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
}
使用hibernate tools工具自动生成映射文件(主键都改为自增)
<generator class="increment" />
然后在配置文件中添加
<!-- 指定映射文件的路径 -->(这里我是栽了坑的,一定要仔细检查格式)
<mapping resource="com/edu/hpu/model/Student.hbm.xml" />
<mapping resource="com/edu/hpu/model/Grade.hbm.xml" />
表的生成策略改为update
<property name="hbm2ddl.auto">update</property>
创建测试类添加测试方法
package com.edu.hpu.test;
import java.util.Date;
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 org.junit.Test;
import com.edu.hpu.model.Grade;
import com.edu.hpu.model.Student;
import com.edu.hpu.util.HibernateUtil;
public class test {
private Session session;
private Transaction tr;
@Before
public void init() {
session = HibernateUtil.getSession();
tr = session.beginTransaction();
}
// 单向一对多关系(班级--》学生)
@Test
public void add() {
Grade g = new Grade("Java一班", "Java一班软件开发");
Student stu1 = new Student("小明", "男");
Student stu2 = new Student("小芳", "女");
// 如果希望在学生表中添加对应的班级编号,需要在班级中添加学生,建立关联关系
g.getStudents().add(stu1);
g.getStudents().add(stu2);
session.save(g);
session.save(stu1);
session.save(stu2);
tr.commit();
}
@After
public void destory() {
HibernateUtil.closeSession(session);
}
}
最后执行
红色标记的是对应的,student表设置的外键
查询学生的测试方法:
//查询班级中包含的学生
@Test
public void findStudentByGrade(){
Grade grade = (Grade) session.get(Grade.class, 1);
System.out.println(grade.getGname()+","+grade.getGdesc());
Set<Student> students = grade.getStudents();
for (Student student : students) {
System.out.println(student.getSname()+","+student.getSex());
}
}
执行结果
修改学生信息添加到一个新的班级,
//将学生添加到一个新的班级中
@Test
public void update(){
Grade g = new Grade("java二班","java软件开发二班");
Student stu = (Student) session.get(Student.class, 1);
g.getStudents().add(stu);
session.save(g);
}
执行结果:
新增了软件二班
原来在一班的学生添加到了二班
删除学生操作
//删除学生信息
@Test
public void delete(){
Student stu = (Student) session.get(Student.class, 1);
session.delete(stu);
}
这里有栽了个坑(@Test注解一定不要忘了写,不然报错)
增删改查测试全部代码
package com.edu.hpu.test;
import java.util.Date;
import java.util.Set;
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 org.junit.Test;
import com.edu.hpu.model.Grade;
import com.edu.hpu.model.Student;
import com.edu.hpu.util.HibernateUtil;
public class test {
private Session session;
private Transaction tr;
@Before
public void init() {
session = HibernateUtil.getSession();
tr = session.beginTransaction();
}
/**
* 单向一对多关系(班级--》学生)
* 建立关联关系后,可以方便的从一个对象导航到另一个对象
* 注意关联的方向
*/
@Test
public void add() {
Grade g = new Grade("Java一班", "Java一班软件开发");
Student stu1 = new Student("小明", "男");
Student stu2 = new Student("小芳", "女");
// 如果希望在学生表中添加对应的班级编号,需要在班级中添加学生,建立关联关系
g.getStudents().add(stu1);
g.getStudents().add(stu2);
session.save(g);
session.save(stu1);
session.save(stu2);
}
//查询班级中包含的学生
@Test
public void findStudentByGrade(){
Grade grade = (Grade) session.get(Grade.class, 1);
System.out.println(grade.getGname()+","+grade.getGdesc());
Set<Student> students = grade.getStudents();
for (Student student : students) {
System.out.println(student.getSname()+","+student.getSex());
}
}
//将学生添加到一个新的班级中
@Test
public void update(){
Grade g = new Grade("java二班","java软件开发二班");
Student stu = (Student) session.get(Student.class, 1);
g.getStudents().add(stu);
session.save(g);
}
//删除学生信息
@Test
public void delete(){
Student stu = (Student) session.get(Student.class, 1);
session.delete(stu);
}
@After
public void destory() {
tr.commit();
HibernateUtil.closeSession(session);
}
}