Hibernate初探之一对多

xiaoxiao2021-02-28  7

Hibernate中的单向一对多关联

一对多映射简介

    如班级与学生的关系就是一对多的关系,那么在数据库中该如何表示呢?     在数据库中可以添加主外键的关联,表现一对多的关系。     通过在一方持有多方的集合实现,即在“一”的一端中使用<set>元素表示持有多的一端的对象

使用MyEclipse进行Hibernate

    1.创建Java工程名为hibernate-one2many     2.在工程中新建文件夹lib,将Hibernate中文件夹required下的包复制到lib文件夹下并添加依赖。     3.在src下添加主配置文件hibernate.cfg.xml,在Hibernate中搜索cfg.xml就能找到模板,复制修改后如下 <?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> <!-- Database connection settings --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url"> jdbc:mysql://localhost:3306/imooc?useUnicode=true&characterEncoding=utf-8 </property> <property name="connection.username">root</property> <property name="connection.password">root</property> <!-- SQL dialect --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- Echo all executed SQL to stdout --> <property name="show_sql">true</property> <!-- Drop and re-create the database schema on startup --> <property name="hbm2ddl.auto">update</property> <!-- 指定映射文件的路径 --> <mapping resource="com/lijy/entity/Grade.hbm.xml"/> <mapping resource="com/lijy/entity/Stu.hbm.xml"/> </session-factory> </hibernate-configuration>

创建HibernateUtil工具类(Hibernate4.3)

package com.lijy.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; /** * Hibernate4.3 * 会话打开和关闭工具类 */ 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()); 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() { if (session != null) { session.close(); } } }

在MySQL数据库中建立表

create table grade ( gid int primary key, gname varchar(20) not null, gdesc varchar(50) ); create table stu ( sid int primary key, sname varchar(20) not null, sex char(2), gid int ); alter table stu add constraint fk_stu_gid foreign key (gid) references grade(gid);

创建持久化和映射文件并配置映射文件

创建实体Grade.java和Stu.java package com.lijy.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<Stu> stus = new HashSet<Stu>(); 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<Stu> getStus() { return stus; } public void setStus(Set<Stu> stus) { this.stus = stus; } public Grade() { super(); } public Grade(int gid, String gname, String gdesc, Set<Stu> stus) { super(); this.gid = gid; this.gname = gname; this.gdesc = gdesc; this.stus = stus; } } package com.lijy.entity; import java.io.Serializable; public class Stu 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; } }创建映射文件Grade.hbm.xml和Stu.hbm.xml <?xml version="1.0"?> <!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.lijy.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"></column> </property> <property name="gdesc"> <column name="gdesc"></column> </property> <!-- 配置单向一对多关联关系 --> <set name="stus" table="stu"> <!-- 指定关联的外键列 --> <key column="gid"></key> <one-to-many class="com.lijy.entity.Stu" /> </set> </class> </hibernate-mapping> <?xml version="1.0"?> <!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.lijy.entity.Stu" table="stu"> <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"></column> </property> <property name="sex"> <column name="sex"></column> </property> </class> </hibernate-mapping> 在主配置文件hibernate.cfg.xml指定映射文件的路径 <mapping resource="com/lijy/entity/Grade.hbm.xml"/> <mapping resource="com/lijy/entity/Stu.hbm.xml"/>

测试-添加查询修改删除学生信息

package com.lijy.entity; import java.util.Set; import org.hibernate.Session; import org.hibernate.Transaction; import com.lijy.util.HibernateUtil; /** * 单向一对多关系关联 * 单向一对多关系,可以方便的从一个对象导航到另一个对象 * 注意关联的方向 */ public class Test { public static void main(String[] args) { // add(); findStudentsByGrade(); // updateStudent(); // deleteStudent(); } //将学生信息添加到班级 public static void add() { Grade grade = new Grade("Java二班","Java软件二班"); Stu stu1 = new Stu("赵六", "男"); Stu stu2 = new Stu("王五", "女"); //如果希望在学生表中添加对应的班级编号,需要在班级中添加学生 grade.getStus().add(stu1); grade.getStus().add(stu2); Session session = HibernateUtil.getSession(); Transaction tx = session.beginTransaction(); session.save(grade); session.save(stu1); session.save(stu2); tx.commit(); HibernateUtil.closeSession(); } //查询班级中包含的学生 public static void findStudentsByGrade() { Session session = HibernateUtil.getSession(); Grade grade = (Grade) session.get(Grade.class, 2); System.out.println(grade); Set<Stu> stus = grade.getStus(); for (Stu stu : stus) { System.out.println(stu); } HibernateUtil.closeSession(); } //学生信息修改 public static void updateStudent(){ Grade grade = new Grade("Java三班", "Java软件三班"); Session session = HibernateUtil.getSession(); Transaction tx = session.beginTransaction(); Stu stu = (Stu) session.get(Stu.class, 1); grade.getStus().add(stu); session.save(grade); tx.commit(); HibernateUtil.closeSession(); } //删除学生信息 public static void deleteStudent() { Session session = HibernateUtil.getSession(); Transaction tx = session.beginTransaction(); Stu stu = (Stu) session.get(Stu.class, 2); session.delete(stu); tx.commit(); HibernateUtil.closeSession(); } }set元素的常用属性                     

单向多对一关联

单向多对一简介

    多对一的关系与关系数据库中的外键参照关系最匹配,即在已方的表中的一个外键参照另一个表的主键。     通过在多方持有一方的引用实现,需要在“多”的一端使用<many-to-one>配置。完全是站的角度不同。

inverse属性的用法

    <set>节点的inverse属性指定关联关系的控制方向,默认由one来维护。     关联关系中,inverse="false" 则为主动方,由主动方负责维护关联关系。     在一对多关联中,只能设置one方的inverse为true,这将有助于性能的改善。

cascade属性的用法

    当设置了cascade属性不为none时,Hibernate会自动持久化所关联的对象。     cascade属性的设置会带来性能上的变动,需谨慎设置     all  >> 对所有操作进行级联操作     save-update >> 执行保存和更新操作时进行级联操作     delete >> 执行删除操作时进行级联操作     none >> 对所有操作不进行级联操作
转载请注明原文地址: https://www.6miu.com/read-1100294.html

最新回复(0)