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

xiaoxiao2021-02-28  116

本篇为慕课网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<Student> studentSet=new HashSet<Student>(); 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> getStudentSet() { return studentSet; } public void setStudentSet(Set<Student> studentSet) { this.studentSet = studentSet; } public Grade(int gid, String gname, String gdesc, Set<Student> studentSet) { this.gid = gid; this.gname = gname; this.gdesc = gdesc; this.studentSet = studentSet; } public Grade() { } } 以上是班级实体类

<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="connection.driver_class" >com.mysql.cj.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3306/hibernate?useUnicode=true&characteEncoding=UTF-8&serverTimezone=UTC</property> <property name="connection.username">root</property> <property name="connection.password"></property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="format_sql">true</property> <property name="show_sql">true</property> <property name="hbm2ddl.auto">create</property> <!--指定映射文件的路径--> <mapping resource="mapper/grade.hbm.xml"/> <mapping resource="mapper/student.hbm.xml"/> </session-factory> </hibernate-configuration> 以上是 hibernate配置文件

<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.xiaoyin.entity.Grade" table="grade"> <id name="gid" column="gid" type="java.lang.Integer"> <generator class="increment"/> </id> <property name="gname" type="java.lang.String"> <column name="gname" length="20" not-null="true"/> </property> <property name="gdesc"type="java.lang.String"> <column name="gdesc"/> </property> <!--配置单向的一对多关联关系--> <set name="studentSet" table="student"> <!--指定关联的外键列--> <key column="gid"></key> <one-to-many class="com.xiaoyin.entity.Student"/> </set> </class> </hibernate-mapping> 班级表的对象映射文件

<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.xiaoyin.entity.Student" table="student"> <id name="sid" column="sid" type="java.lang.Integer"> <generator class="increment"/> </id> <property name="sname" type="java.lang.String"> <column name="sname" length="20" not-null="true"/> </property> <property name="sex" type="java.lang.String"> <column name="sex" length="2"/> </property> </class> </hibernate-mapping> 学生表的对象映射文件

测试类如下:

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

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

在mysqld节点下添加

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

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

转载请注明原文地址: https://www.6miu.com/read-19450.html

最新回复(0)