映射類型(4種):
常見的及常用的:一對多、多對一。
一對多映射(one-to-many):
如何表示一對多的關聯關係:
例子:一個班級對應多個學生。在班級中定義一個學生的集合。
在數據庫中創建表student(學生表)和grade(班級表)
hibernate.cfg.xml(注意指定映射文件的路徑):
<?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">
<!-- 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/hibernate?useUnicode=true&characterEncoding=UTF-8
</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="myeclipse.connection.profile">mysql</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<property name="hibernate.current_session_context_class">thread</property>
<!-- 指定映射文件的路徑 -->
<mapping resource="com/entity/Grade.hbm.xml" />
<mapping resource="com/entity/Student.hbm.xml" />
</session-factory>
</hibernate-configuration>
創建實體類student和grade(注意實現Serializable接口):
package com.entity;
import java.io.Serializable;
public class Student implements Serializable{
private int sid; //學生編號
private String sname; //學生姓名
private String 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;
}
public Student() {
super();
}
public Student(String sname, String sex) {
super();
this.sname = sname;
this.sex = sex;
}
}
package com.entity;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
public class Grade implements Serializable {
private int gid; //班級編號
private String gname; //班級名稱
private String gdesc; //班級詳細信息
//建立一對多的關聯關係:在一方(班級)定義一個多方(學生)的集合
private Set<Student> students=new HashSet<Student>(); //set集合元素不允許重複,元素沒有順序
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;
}
public Grade() {
super();
// TODO Auto-generated constructor stub
}
public Grade(int gid, String gname, String gdesc, Set<Student> students) {
super();
this.gid = gid;
this.gname = gname;
this.gdesc = gdesc;
this.students = students;
}
public Grade(String gname, String gdesc) {
super();
this.gname = gname;
this.gdesc = gdesc;
}
}
Student.hbm.xml:
<?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>
<class name="com.entity.Student" table="student">
<id name="sid" column="sid" type="java.lang.Integer">
<generator class="increment"></generator>
</id>
<property name="sname" type="java.lang.String">
<column name="sname" length="20" not-null="true"></column>
</property>
<property name="sex" type="java.lang.String">
<column name="sex"></column>
</property>
</class>
</hibernate-mapping>
Grade.hbm.xml(注意配置單向的一對多關聯關係用到Set):
<?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>
<class name="com.entity.Grade" table="grade">
<id name="gid" column="gid" type="java.lang.Integer">
<generator class="increment"></generator>
</id>
<property name="gname" type="java.lang.String">
<column name="gname" length="20" not-null="true"></column>
</property>
<property name="gdesc" type="java.lang.String">
<column name="gdesc"></column>
</property>
<!-- 配置單向的一對多關聯關係 -->
<set name="students" table="student">
<!-- 指定關聯的外鍵列 -->
<key column="gid"></key>
<one-to-many class="com.entity.Student"></one-to-many>
</set>
</class>
</hibernate-mapping>
創建一個工具類HibernateUtil用於初始化hibernate、獲取會話工廠和會話 、關閉會話:
package com.util;
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;
//工具類:初始化hibernate、獲取會話工廠和會話 、關閉會話
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()); //StandardServiceRegistryBuilder:hibernate4.3之後纔有
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){ //參數是要關閉的session
if(session!=null){
session.close();
}
}
}
測試類Test,實現增刪改查:
package com.entity;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.util.HibernateUtil;
/**
* 單向一對多關聯關係(班級(一方)指向學生(多方))
* 建立關聯關係後,可以方便的從一個對象導航到另一個對象(注意是單向關聯)
* */
public class Test {
public static void main(String[] args) {
// add();
// findStudentsByGrade();
// update();
delete();
}
//將學生添加到班級
public static 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 session=HibernateUtil.getSession(); //得到會話
Transaction tx=session.beginTransaction(); //開啓事務
session.save(g);
session.save(stu1);
session.save(stu2);
tx.commit(); //提交事務
HibernateUtil.closeSession(session); //關閉session
}
//查詢班級中包含的學生信息
public static void findStudentsByGrade(){
Session session=HibernateUtil.getSession(); //獲得session
Grade grade=(Grade) session.get(Grade.class,1); //獲取一個班級信息(本例查詢ID爲1的班級)
System.out.println(grade.getGname()+","+grade.getGdesc());
//得到學生集合
Set<Student> students=grade.getStudents();
for (Student student : students) {
System.out.println(student.getSname()+","+student.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); //獲取id爲1的學生信息
g.getStudents().add(stu);
session.save(g);
tx.commit(); //提交事務
HibernateUtil.closeSession(session); //關閉session
}
//刪除學生信息
public static void delete(){
Session session=HibernateUtil.getSession(); //得到會話
Transaction tx=session.beginTransaction(); //開啓事務
//獲得學生信息
Student stu=(Student) session.get(Student.class, 2); //獲取id爲2的學生信息
//刪除這個學生
session.delete(stu);
tx.commit();
HibernateUtil.closeSession(session);
}
}
執行add方法,數據庫:
grade表:
student表:
執行查詢方法,控制檯:
執行update,數據庫:
grade表:
student表:
執行delete,數據庫:
grade表:
student表:
Set元素的常用屬性:
單向的一對多映射通過在一方定義一個多方的集合。在映射文件中通過Set元素進行一對多映射的配置。