一对多
一个grade有多个student,底层实现就为外键关联,在自己赋值外键
而Hibernate框架可以帮我们完成一对多关系
拿着一去找多:知道六年级一班,去找六年级一班的所有学生
配置步骤:
1.在grade[一方]添加一个student<set>或student<list>成员变量
private Set students;
2.在grade[一方]的配置文件(Grade.hbm.xml)配置单向的一对多关联关系
<!-- 配置一对多关联关系 -->
<set name="students" table="student">
<!-- 指定关联的外键列 -->
<key column="gid"></key>
<one-to-many class="com.imooc.entity.Student"/>
</set>
多对一
拿着多去找一:小明是哪个班的?
配置步骤:
1.在student[多方]类中添加一个grade[一方]的引用
private Grade grade;
2.在student[多方]配置文件(Student.hbm.xml)中添加
//班级名称 班级类 外键
表格
- 班级表
grade |
---|
gid |
gname |
gdesc |
* 学生表
student |
---|
sid |
sname |
sex |
gid |
底层表格创建一样,student有个外键关联grade的grade
sql创建代码:
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);
JavaBean创建
班级
一个班级对应多个学生,在班级类中添加一个set表示有多个学生(1:n)public class Grade implements Serializable{ private int id; private String gname; private String desc; //在一方定义一个多方的集合 private Set<Student> students; //一对多个关键,由一到多,单向 public Grade(){} public Grade(int gid, String gname, String gdesc) { super(); this.gid = gid; this.gname = gname; this.gdesc = gdesc; } //gid为主键,hibernate自动根据配置时写的策略赋值 public Grade(String gname, String gdesc) { super(); this.gname = gname; this.gdesc = gdesc; } //省略setter和getter }
学生
一个学生对应一个班级,则一个学生类中应创一个grade的引用public class Student implements Serializable{ private int sid; private String sname; private String sex; private Grade grade; //多到一的关键,单向 //sid为主键,框架自动赋值,在Student.hbm.xml中配置赋值策略 public Student(String sname,String sex) { super(); this.sname = sanme; this.sex = sex; } }
添加问题
有一个学生,要添加到学生表里,但是学生的班级问题(学生表中有gid外键)
//创建一个班级,有班级则要查询找出班级
Grade g=new Grade("Java一班", "Java软件开发一班");
//新的同学
Student stu1=new Student("张三", "男");
Student stu2=new Student("穆女神", "女");
//如果希望在学生表中添加对应的班级编号,需要在班级中添加学生,建立关联关系
g.getStudents().add(stu1);
g.getStudents().add(stu2);
//得到一个会话
Session session=HibernateUtil.getSession(); //方法打包在HibernateUtil类中
Transaction tx=session.beginTransaction(); //创建事件
session.save(g); //保存g,如果原来有的班级就不用,查找出就好
session.save(stu1);
session.save(stu2);
tx.commit(); //提交事件
HibernateUtil.closeSession(session); //关闭会话
Hibernate工作原理:(主键赋值为增加策略)
1. 找出grade,student中主键的最大值
2. 最大值+1赋值给新添加的grade,student的主键
3. 将student的外键gid赋值
查询班级中的学生 由一找多
底层自己做时:去学生表中搜gid=1,返回集合
hibernate:建立关联关系后,可以方便的从一个对象导航到另一个对象
public static void findStudentsByGrade(){
//得到会话
Session session=HibernateUtil.getSession();
//找出id=1的班级
Grade grade=(Grade) session.get(Grade.class, 1);
System.out.println(grade.getGname()+","+grade.getGdesc()); //打印查看
//直接用类方法获得这个班级的学生
Set<Student> students=grade.getStudents();
for(Student stu:students){
System.out.println(stu.getSname()+","+stu.getSex());
}
}
更新学生信息 修改学生的班级
public static void update(){
Grade g=new Grade("Java二班", "Java软件开发二班");
Session session=HibernateUtil.getSession();
Transaction tx=session.beginTransaction();
Student stu=(Student) session.get(Student.class, 1);
g.getStudents().add(stu); //将student添加到新的班级里
session.save(g);
tx.commit();
HibernateUtil.closeSession(session);
}
删除学生信息
public static void delete(){
Session session=HibernateUtil.getSession();
Transaction tx=session.beginTransaction();
Student stu=(Student) session.get(Student.class, 2);
session.delete(stu);
tx.commit();
HibernateUtil.closeSession(session);
}
Hibernate工具类
集成Hibernate的相关方法,Hibernate版本为4
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();
}
}
}