本篇为慕课网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">以上是 hibernate配置文件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"/>
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
在mysqld节点下添加
最后测试,测试结果正常。