Hibernate(3)——一对多映射关系

本篇为慕课网hibernate课程笔记。

数据库中,可以通过添加外键的方式实现一对多的关系。Java程序中则可以通过集合的方式实现。

举例:一个班级可以有多个学生,这就是一个一对多的关系,那么在一个学生表中,就可以将“班级”这个字段设置为外键。

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(20),
  gid INT
);
ALTER TABLE student ADD CONSTRAINT fk_student_gid FOREIGN KEY(gid)REFERENCES grade(gid);
以上是MySQL数据库中创建表所用的SQL语句。

为了方便编写后面的测试,建立一个HibernateUtil类,用以产生SessionFactory以及Session。代码如下:

package com.xiaoyin.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;


public class HibernateUtil {
    private static SessionFactory sessionFactory;
    private static Session session;

    static {
        Configuration config=new Configuration().configure();
        StandardServiceRegistryBuilder ssrb=new StandardServiceRegistryBuilder().applySettings(config.getProperties());
        StandardServiceRegistry standardServiceRegistry=ssrb.build();
        sessionFactory=config.buildSessionFactory(standardServiceRegistry);

    }

    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();
        }
    }
}
实体类、hibernate配置文件以及对象关系映射文件如下:

package com.xiaoyin.entity;

import java.io.Serializable;

public class Student implements Serializable{
    private int sid;
    private String sname;
    private String sex;
    private int gid;

    public Student(int sid, String sname, String sex, int gid) {
        this.sid = sid;
        this.sname = sname;
        this.sex = sex;
        this.gid = gid;
    }

    public Student() {
    }

    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 getGid() {
        return gid;
    }

    public void setGid(int gid) {
        this.gid = gid;
    }

    @Override
    public String toString() {
        return "Student{" +
                "sid=" + sid +
                ", sname='" + sname + '\'' +
                ", sex='" + sex + '\'' +
                ", gid=" + gid +
                '}';
    }
}
以上是学生实体类;

package com.xiaoyin.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 studentSet=new HashSet();

    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 getStudentSet() {
        return studentSet;
    }

    public void setStudentSet(Set studentSet) {
        this.studentSet = studentSet;
    }

    public Grade(int gid, String gname, String gdesc, Set studentSet) {
        this.gid = gid;
        this.gname = gname;
        this.gdesc = gdesc;
        this.studentSet = studentSet;
    }

    public Grade() {
    }
}
以上是班级实体类

xml version='1.0' encoding='UTF-8'?>
hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

    
        name="connection.driver_class" >com.mysql.cj.jdbc.Driver
        name="connection.url">jdbc:mysql://localhost:3306/hibernate?useUnicode=true&characteEncoding=UTF-8&serverTimezone=UTC
        name="connection.username">root
        name="connection.password">
        name="dialect">org.hibernate.dialect.MySQLDialect

        name="format_sql">true
        name="show_sql">true
        name="hbm2ddl.auto">create

        
        resource="mapper/grade.hbm.xml"/>
        resource="mapper/student.hbm.xml"/>
    
以上是 hibernate配置文件

xml version='1.0' encoding='UTF-8'?>
hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">


name="com.xiaoyin.entity.Grade" table="grade">
    name="gid" column="gid" type="java.lang.Integer">
        class="increment"/>
    
    name="gname" type="java.lang.String">
        name="gname" length="20" not-null="true"/>
    
    name="gdesc"type="java.lang.String">
        name="gdesc"/>
    
    
    name="studentSet" table="student">
        
        column="gid">
        class="com.xiaoyin.entity.Student"/>
    

班级表的对象映射文件

xml version='1.0' encoding='UTF-8'?>
hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">


    name="com.xiaoyin.entity.Student" table="student">
        name="sid" column="sid" type="java.lang.Integer">
            class="increment"/>
        
        name="sname" type="java.lang.String">
            name="sname" length="20" not-null="true"/>
        
        name="sex" type="java.lang.String">
            name="sex" length="2"/>
        
    
学生表的对象映射文件

测试类如下:

import com.xiaoyin.entity.Grade;
import com.xiaoyin.entity.Student;
import com.xiaoyin.util.HibernateUtil;
import org.hibernate.Session;
import org.hibernate.Transaction;

public class TestOne2Many {
    public static void main(String[] args){
        add();
    }

    public static void add(){
        Grade grade=new Grade("15级1版","15级分析/无机方向");
        Student stu1=new Student("张三","男");
        Student stu2=new Student("李四","男");

        //如果要在学生表中添加班级信息,需要在班级中添加学生,建立关联
        grade.getStudentSet().add(stu1);
        grade.getStudentSet().add(stu2);

        Session session= HibernateUtil.getSession();
        Transaction transaction=session.beginTransaction();
        session.save(grade);
        session.save(stu1);
        session.save(stu2);
        transaction.commit();
        HibernateUtil.closeSession(session);
    }
}

到这里测试过程中遇到了一点小问题,也 一并说一下。

我们保存到数据中的中文数据,查询时显示为?。这是由于MySQL默认的字符编码不是UTF-8

  1. 如果是windows操作系统,在CMD下输入mysql
  2. 然后输入
  3. show variables like "%char%";
  4. 看到如下  
  5. +--------------------------+---------------+  
  6. | Variable_name | Value |  
  7. +--------------------------+---------------+  
  8. | character_set_client | gbk |  
  9. | character_set_connection | gbk |  
  10. | character_set_database | utf8 |  
  11. | character_set_filesystem | binary |  
  12. | character_set_results | gbk |  
  13. | character_set_server | utf8 |  
  14. | character_set_system | utf8 |  
我们需要更改安装路径下的my.ini文件

在mysqld节点下添加

  1. character-set-server=utf8 
    collation-server=utf8_general_ci 
然后重启MySQL服务。

最后测试,测试结果正常。

你可能感兴趣的:(javaSE,javaWEB)