Hibernate一對多、多對一的關係表達
一、關係表達:
1、一對多、多對一表的關係:
學生表:
班級表:
在學生表中,學生的學號是主鍵。在班級表中,班級號是主鍵,因此,學生表的外鍵是classno。因此,班級對應學生是一對多,學生對應班級是多對一。因為,一個班級可以有多個學生,但是一個學生只能在一個班級。
2、對象的一對多、多對一關係:
(1)在Class類中,定義Set集合,表達一對多的關係:
package pers.zhb.domain;
import java.util.HashSet;
import java.util.Set;
public class Class {
private String classno;
private String department;
private String monitor;
private String classname;
private Set<Student> classes=new HashSet<Student>();//使用set集合表達一對多關係
public Class(){
}
public Set<Student> getClasses() {
return classes;
}
public void setClasses(Set<Student> classes) {
this.classes = classes;
}
public String getMonitor() {
return monitor;
}
public void setMonitor(String monitor) {
this.monitor = monitor;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
public String getClassname() {
return classname;
}
public void setClassname(String classname) {
this.classname = classname;
}
public String getClassno() {
return classno;
}
public void setClassno(String classno) {
this.classno = classno;
}
@Override
public String toString() {
return "Class{" +
"classno='" + classno + '\'' +
", department='" + department + '\'' +
", monitor='" + monitor + '\'' +
", classname='" + classname + '\'' +
", classes=" + classes +
'}';
}
}
package pers.zhb.domain;
public class Student {
private Integer studentno;
private String sname;
private String sex;
private String birthday;
private String classno;
private Float point;
private String phone;
private String email;
private Clas aClas;
public Student(){//無參的構造方法
}
public Clas getaClas() {
return aClas;
}
public void setaClas(Clas aClas) {
this.aClas = aClas;
}
@Override
public String toString() {
return "Student{" +
"studentno='" + studentno + '\'' +
", sname='" + sname + '\'' +
", sex='" + sex + '\'' +
", birthday='" + birthday + '\'' +
", classno='" + classno + '\'' +
", point=" + point +
", phone='" + phone + '\'' +
", email='" + email + '\'' +
'}';
}
public int getStudentno() {
return studentno;
}
public void setStudentno(int studentno) {
this.studentno = studentno;
}
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 String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public String getClassno() {
return classno;
}
public void setClassno(String classno) {
this.classno = classno;
}
public float getPoint() {
return point;
}
public void setPoint(float point) {
this.point = point;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
(2)定義學生和班級的關係:
package pers.zhb.domain;
import java.util.HashSet;
import java.util.Set;
public class Clas {
private String classno;
private String department;
private String monitor;
private String classname;
private Set<Student> students=new HashSet<Student>();//使用set集合表達一對多關係
public Clas(){
}
public Set<Student> getStudents() {
return students;
}
public void setClasses(Set<Student> students) {
this.students = students;
}
public String getMonitor() {
return monitor;
}
public void setMonitor(String monitor) {
this.monitor = monitor;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
public String getClassname() {
return classname;
}
public void setClassname(String classname) {
this.classname = classname;
}
public String getClassno() {
return classno;
}
public void setClassno(String classno) {
this.classno = classno;
}
@Override
public String toString() {
return "Class{" +
"classno='" + classno + '\'' +
", department='" + department + '\'' +
", monitor='" + monitor + '\'' +
", classname='" + classname + '\'' +
",students=" + students +
'}';
}
}
3、配置映射文件:
Class.hbm.xml:
(1)實現一對多的關係映射,即:一個班級對應多個學生:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="pers.zhb.domain"> <class name="Clas" table="class"> <id name="classno" column="classno"> <generator class="native"></generator> </id><!--主鍵--> <property name="department" column="department"></property> <property name="monitor" column="monitor"></property> <property name="classname" column="classname"></property> <set name="students" table="student"><!--一對多關係配置--> <key column="classno" update="false"></key><!--指定了集合表的外鍵--> <one-to-many class="Student"></one-to-many> </set> </class> </hibernate-mapping>
<set name="students">
指定映射的存儲學生的集合的名字。
<key column="classesno"></key>
映射的class表的外鍵。
<one-to-many class="Student"></one-to-many>
指定學生的類型。
(2)實現多對一的關係映射,即:多個學生對應一個班級。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="pers.zhb.domain"> <class name="Student" table="student"> <id name="studentno" column="studentno" > <generator class="native"></generator> </id> <property name="birthday" column="birthday"></property> <property name="classno" column="classno" insert="false" update="false"></property> <property name="email" column="email"></property> <property name="phone" column="phone"></property> <property name="sex" column="sex"></property> <property name="sname" column="sname"></property> <property name="point" column="point"></property> <many-to-one name="aClas" column="classno" class="Clas"></many-to-one> </class> </hibernate-mapping>
name屬性:映射的班級。
column屬性:映射的班級對象對應的外鍵。
class屬性:指定班級的類型。
4、主配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<!--配置數據庫信息-必須的-->
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/stu_mangement</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!--配置hibernate信息-可選的-->
<property name="hibernate.show_sql">true</property><!--輸出底層sql語句-->
<property name="hibernate.format_sql">true</property><!--格式化輸出sql語句-->
<property name="hibernate.hbm2ddl.auto">update</property><!--hibernate幫助創建表,如果已經有表更新表,如果沒有則創建新表-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<property name="hibernate.connection.isolation">4</property>
<!--指定session與當前線程綁定-->
<property name="hibernate.current_session_context_class">thread</property>
<!--配置數據庫的方言,讓hibernate識別框架自己的特有語句-->
<!--把映射文件放到核心配置文件-->
<mapping resource="pers/zhb/domain/Student.hbm.xml"/><!--都在src目錄下-->
<mapping resource="pers/zhb/domain/Class.hbm.xml"/><!--都在src目錄下-->
</session-factory>
</hibernate-configuration>
二、具體運用:
1、增加:
(1)創建一個新班級併為新班級添加兩名學生:
public class Test { public static void testSel() { Session session = HibernateUtils.openSession();//獲得session Transaction transaction = session.beginTransaction();//開啟事務 Clas clas=new Clas(); clas.setClassname("計科171"); clas.setClassno(4600); clas.setDepartment("一號樓"); clas.setMonitor("zhai"); Student student=new Student(); student.setSname("翟"); student.setStudentno(2017151411); student.setPoint(123f); student.setSex("男"); student.setBirthday("2019-11-11"); student.setPhone("18739496522"); student.setClassno("221221"); student.setEmail("34288334@qq.com"); Student student1=new Student(); student1.setSname("翟hb"); student1.setStudentno(2017151419); student1.setPoint(666f); student1.setSex("女"); student1.setBirthday("2019-11-11"); student1.setPhone("18739496522"); student1.setClassno("221221"); student1.setEmail("34288334@qq.com"); clas.getStudents().add(student);//一對多,一個班級下有多個學生 clas.getStudents().add(student1);//獲取Set集合對象並向其中添加元素 student.setaClas(clas);//多對一,學生屬於哪一個班級 student1.setaClas(clas); session.save(clas); session.save(student); session.save(student1); transaction.commit();//提交事務 session.close();//關閉資源 }
(2)為一個已經存在的班級添加學生:
public static void testAdd(){
Session session = HibernateUtils.openSession();//獲得session
Transaction transaction = session.beginTransaction();//開啟事務
Clas clas=session.get(Clas.class,80501);//獲得一個已經存在的班級
Student student=new Student();//創建一個學生對象
student.setSname("翟zz");
student.setStudentno(20190000);
student.setPoint(133f);
student.setSex("男");
student.setBirthday("2019-11-16");
student.setPhone("18739496522");
student.setEmail("34288334@qq.com");
Student student1=new Student();//再創建一個學生對象
student1.setSname("翟zz");
student1.setStudentno(20190000);
student1.setPoint(133f);
student1.setSex("男");
student1.setBirthday("2019-11-16");
student1.setPhone("18739496522");
student1.setEmail("34288334@qq.com");
clas.getStudents().add(student);//學生添加到班級
student.setaClas(clas);//班級與學生對應
clas.getStudents().add(student1);
student1.setaClas(clas);
session.save(student);
session.save(student1);
transaction.commit();//提交事務
session.close();//關閉資源
}
2、刪除:
刪除80501班的一名學生信息:
public static void testDel() {
Session session = HibernateUtils.openSession();//獲得session
Transaction transaction = session.beginTransaction();//開啟事務
Clas clas=session.get(Clas.class,80501);//獲得要刪除的學生屬於那一個班級
Student student=session.get(Student.class,937221532);//獲得要刪除的學生
clas.getStudents().remove(student);
student.setaClas(null);
transaction.commit();//提交事務
session.close();//關閉資源
}
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※想知道網站建置、網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計及後台網頁設計
※不管是台北網頁設計公司、台中網頁設計公司,全省皆有專員為您服務
※Google地圖已可更新顯示潭子電動車充電站設置地點!!
※別再煩惱如何寫文案,掌握八大原則!