由于在数据表之间可以通过外键进行关联,在使用Hibernate操作映射到存在关联关系的数据表的对象时,需要将对象的关联关系与数据表的外键关联进行映射。
1.前言
这篇文章标题为单向多对一,其实是为以后的种种映射和HQL操作作一个铺垫,实现单向多对一或者一对多再或者双向多对一都很简单,毕竟现在的工具实在太多,但是当我们用工具的同时却很少考虑它的机制,就比如用实体类自动生成hbm.xml文件或者通过反向工程由数据表生成hbm.xml文件,它的主键生成机制就不是一样的。废话不多说,开始搬砖。
首先建立hibernate.cfg.xml和会话工厂类HibernateUtil,然后添加两个待操作的实体类和相应的映射文件。
HibernateUtil如下:
package com.zzh.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; publicclass HibernateUtil { privatestatic SessionFactory sessionFactory; privatestatic Session session; static { // 创建Configuration对象,读取hibernate.cfg.xml文件,完成初始化 Configuration config = new Configuration().configure(); StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder() .applySettings(config.getProperties()); StandardServiceRegistry ssr=ssrb.build(); sessionFactory=config.buildSessionFactory(ssr); } //获取SessionFactorypublicstatic SessionFactory getSessionFactory(){ return sessionFactory; } //获取Sessionpublicstatic Session getSession(){ session=sessionFactory.openSession(); return session; } //关闭Sessionpublicstaticvoid closeSession(Session session){ if(session!=null){ session.close(); } } }View Code
两个实体类班级Grade和学生Student
package com.zzh.entity; import java.io.Serializable; import java.util.HashSet; import java.util.Set; publicclass Grade implements Serializable { privateint gid; private String gname; private String gdesc; publicint getGid() { return gid; } publicvoid setGid(int gid) { this.gid = gid; } public String getGname() { return gname; } publicvoid setGname(String gname) { this.gname = gname; } public String getGdesc() { return gdesc; } publicvoid setGdesc(String gdesc) { this.gdesc = gdesc; } public Grade() { super(); } public Grade(int gid, String gname, String gdesc) { super(); this.gid = gid; this.gname = gname; this.gdesc = gdesc; } public Grade(String gname, String gdesc) { super(); this.gname = gname; this.gdesc = gdesc; } }
package com.zzh.entity; import java.io.Serializable; publicclass Student implements Serializable { privateint sid; private String sname; private String sex; //在多方定义一个一方的引用private Grade grade; public Grade getGrade() { return grade; } publicvoid setGrade(Grade grade) { this.grade = grade; } publicint getSid() { return sid; } publicvoid setSid(int sid) { this.sid = sid; } public String getSname() { return sname; } publicvoid setSname(String sname) { this.sname = sname; } public String getSex() { return sex; } publicvoid setSex(String sex) { this.sex = sex; } public Student() { super(); } public Student(String sname, String sex) { super(); this.sname = sname; this.sex = sex; } }
可以看出我在Student类中使用Grade类声明了grade属性,并添加了getter和setter,以体现实体类Student对Grade的关联关系,在下面的映射表中只需要在“多”的一方配置。注意,Student类中添加的grade属性为Grade,它是一个持久化类Grade的对象属性,不是一个基本类型属性,因此不能用
Grade.hbm.xml:
View Code<class name="com.zzh.entity.Grade" table="GRADE"> class="increment"/> class>
Student.hbm.xml: