hibernate 流程及 几种关系总结

本文详细介绍了Hibernate ORM框架的核心概念,包括重要的类与接口、执行流程、以及多种关系的实现方式,如一对一、一对多、多对一和多对多等。通过实际代码示例,展示了如何使用Hibernate进行实体管理、事务处理以及数据查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Hibernate 总结流程:

重要的几个类 与接口:

Configuration接口:Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory对象。

SessionFactory接口:SessionFactory接口负责初始化Hibernate,并创建Session对象;

Transcation接口:Transaction接口负责事务相关的操作。

Session接口:Session接口负责执行被持久化对象的CRUD(Create,Retrieve,Update,Delete)增查修删操作。

Query接口:主要使用hql查询数据;

Criteria接口:主要使用qbc查询数据;

Query和Criteria接口负责执行各种数据库查询。

执行流程:Configuration-->SessionFactory-->Session-->Transcation

Session-->Query或Criteria或CRUD操作;

Hibernate 包中核心包: log4j-1.2.14.jar hibernate3.jar

按流程执行:

public class HibernateFoctory {

private static Configuration configuration = new Configuration();

private static String configFile = "/hibernate.xml";

private static SessionFactory sessionFactory;

static {

//由Configuration 对象加载hibernate.xml配置文件,并创建SessionFactory对象;

try {

configuration.configure(configFile);

sessionFactory = configuration.buildSessionFactory();

} catch (Exception e) {

System.err.println("%%%% Error Creating SessionFactory %%%%");

e.printStackTrace();

}

}

public static Session getSession() {

//由SessionFactory对象创建Session对象;

Session session = sessionFactory.openSession();

return session;

}

}

以上代码:执行 :Configuration-->SessionFactory-->Session-->

public class BaseDao {

Session session = null;

Transaction transaction = null;

public void save(FuserVO vo){

try {

//由SessionFactory对象创建Session对象;

session = HibernateFoctory.getSession();

//由Session对象开始一个事务;

transaction = session.beginTransaction();

session.save(vo);

transaction.commit();

session.close();

System.out.println("---添加成功");

} catch (HibernateException e) {

e.printStackTrace();

if(session !=null){

session.close();

}

if(transaction!=null){

transaction.rollback();

}

}

}

这段是: Transcation -àSession-->Query或Criteria或CRUD操作;

下面是”一对一主键约束实例

作业(一对一主键关系):

用户表(id,姓名,身份证,地址,邮编,电话)

账号表(id,用户名,密码,状态)

登陆记录表(id,登陆ip,登陆时间)

要求:用户id为主键;

账号id,登陆id为主键,并且是用户表的外键;

用户表跟账号表一对一关系;

账号表跟登陆记录表一对一关系;

功能:

1.用户表的注册; 保存用户数据时自动保存账号信息;

2.用户登陆:登陆根据账号表登陆;登陆成功生成登陆记录数据;

3.登陆成功:显示用户列表数据(id,姓名,用户名,身份证,电话,登陆ip,登陆时间,状态)

4.删除用户信息,并级联删除账号,登陆记录数据;

<!-- name属性表示数据表对应的VO地址

table表示数据库中那张表

catalog 表示对应相应数据库的名称;

-->

<class name="com.bean.FuserVO" table="fuser" catalog="tt">

<!-- id表示主键 name表示vo中的主键对应的字段, type对应vo中的数据类型 -->

<id name="id" type="java.lang.Integer">

<!-- column 中name表示数据表中的主键对应的列名称

generator 表示主键生成策略;assigned值表示由用户手动指定主键值;

如果主键为自增长,该主键用户不用指定,需用native策略;

-->

<column name="fid">

</column>

<generator class="assigned"></generator>

</id>

<property name="username" type="java.lang.String">

<column name="fusername" not-null="true"></column>

</property>

<property name="password" type="java.lang.String">

<column name="fpassword"></column>

</property>

<property name="email" type="java.lang.String">

<column name="email"></column>

</property>

</class>

Hibernate几种关系总结:

一对一:实例 一对一外键关系作业:

球队(球队编号,球队名称)

球队地址(地址编号,地址城市,地址邮编,球队id)

球队负责人(负责人id,负责人姓名,负责人电话,球队id)

球队只有一个地址;球队只有一个负责人;

功能:1.注册(三个表信息一起注册)

2.遍历所有(球队编号,球队名称,地址城市,地址邮编,负责人姓名,负责人电话)

3.删除球队,相应三张表数据全删;

4.修改,参考注册(级联修改);

public class BasketballTeam implements Serializable{

private static final long serialVersionUID = 1L;

private Integer teamID;

private String teamName;

private BasketballAdress address;

private BaskketballPer per; 球队(球队编号,球队名称)bean类

//球队负责人(负责人id,负责人姓名,负责人电话,球队id)

public class BaskketballPer implements Serializable{

private static final long serialVersionUID = 1L;

private Integer perID;

private String perName;

private String perPhont;

private Integer teamIDB;

private BasketballTeam teamB;

//球队地址(地址编号,地址城市,地址邮编,球队id)

public class BasketballAdress implements Serializable{

private static final long serialVersionUID = 1L;

private Integer addressID;

private String addressCity;

private String addressCode;

private Integer teamIDA;

private BasketballTeam team;

球队配置关系:

<class name="com.bean.BasketballTeam" table="basketball_FK" catalog="test">

<id name="teamID" type="java.lang.Integer">

<column name="teamID">

</column>

<generator class="native"> //自动增长

</generator>

</id>

<one-to-one name="address" class="com.bean.BasketballAdress" cascade="all"></one-to-one>

<one-to-one name="per" class="com.bean.BaskketballPer" cascade="all"></one-to-one>

</class>

地址配置关系

<class name="com.bean.BasketballAdress" table="Adress_FK" catalog="test">

<id name="addressID" type="java.lang.Integer">

<column name="addressID">

</column>

<generator class="native">

</generator>

</id>

<!-- 指向球队表的外键 一般都是根据主表去添加 -->

<property name="teamIDA" type="java.lang.Integer" insert="false" update="false">

<column name="teamIDA"></column>

</property>

<many-to-one name="team" class="com.bean.BasketballTeam" column="teamIDA" unique="true">

</many-to-one>

</class>

负责人:

<class name="com.bean.BaskketballPer" table="Per_FK" catalog="test">

<id name="perID" type="java.lang.Integer">

<column name="perID">

</column>

<generator class="native">

</generator>

</id>

<!-- 指向员工表的外键 一般都是根据主表去添加 -->

<property name="teamIDB" type="java.lang.Integer" insert="false" update="false">

<column name="teamIDB"></column>

</property>

<many-to-one name="teamB" class="com.bean.BasketballTeam" column="teamIDB" unique="true"></many-to-one>

</class>

一对多,多对一作业:

员工表(id,姓名,性别,邮箱,部门id)

账号表(id,员工id,用户名,密码,注册时间)

部门表(id,部门名称,部门电话)

说明:

员工对账号一对一,员工对部门多对一,部门对员工一对多;

功能:

1.注册员工(保存级联注册账号)

2.注册部门(可以添加员工;可以级联添加N个员工)

3.员工遍历(id,姓名,性别,邮箱,用户名,注册时间,部门名称,部门电话);删除员工;

4.第三题中部门名称用一个a标签,点击弹出一个窗体;窗体中显示该部门所有员工;

5.第四题中删除员工;

6.删除部门(级联删除所有员工;员工级联删除账号);

2.注册部门(可以添加员工;可以级联添加N个员工) xml文件

private Integer eId ;

private String eName;

private Character eSex;

private Integer dId; //部门ID

private Faccount account; // 账号表

private Fdept dept;

<class name="com.bean.Femployee" table="Femployee_FK" catalog="test">

<id name="eId" type="java.lang.Integer">

<column name="eId">

</column>

<generator class="native">

</generator>

</id>

<property name="eName" type="java.lang.String">

<column name="eName_T"></column>

</property>

<property name="eSex" type="java.lang.Character">

<column name="eSex"></column>

</property>

<property name="dId" type="java.lang.Integer" insert="false" update="false">

<column name="dId"></column>

</property>

<one-to-one

name="account"class="com.bean.Faccount"cascade="all"property-ref="eId"></one-to-one>

<one-to-one name="address" class="com.bean.BasketballAdress" cascade="all" property-ref="teamIDA"></one-to-one>

<many-to-one name="dept" class="com.bean.Fdept" column="dId"></many-to-one>

</class>

账号表(id,员工id,用户名,密码,注册时间)

private Integer aID;

private Integer eId;

private String userName;

private String userPass;

private Date datetime;

private Femployee employee

<class name="com.bean.Faccount" table="Faccount_FK" catalog="test">

<id name="aID" type="java.lang.Integer">

<column name="aID">

</column>

<generator class="native">

</generator>

</id>

<property name="userName" type="java.lang.String">

<column name="userName"></column>

</property>

<property name="userPass" type="java.lang.String">

<column name="userPass"></column>

</property>

<property name="datetime" type="java.util.Date" >

<column name="datetime"></column>

</property>

<!-- 指向员工表的外键 一般都是根据主表去添加 表示跟员工表产生关系 -->

<property name="eId" type="java.lang.Integer" insert="false" update="false">

<column name="eId"></column>

</property>

<many-to-one name="employee" class="com.bean.Femployee" column="eId" unique="true">

</many-to-one>

</class>

部门:

private Integer dId;

private String dName;

private String dPhont;

private Set<Femployee> employeeSet = new HashSet<Femployee>();

<class name="com.bean.Fdept" table="Fdept_FK" catalog="test">

<id name="dId" type="java.lang.Integer">

<column name="dId">

</column>

<generator class="native">

</generator>

</id>

<set name="employeeSet" cascade="all" inverse="true" lazy="false">

<key column="dId"></key>

<one-to-many class="com.bean.Femployee" />

</set>

多对多:

学生表(id,姓名,性别)

选课表(id,课程名称)

学生选课表(课程id,学生id)

public class SCourseBean implements java.io.Serializable { 课程bean

private Integer cid;

private String cname;

/**

* 课程对学生,一对多(一门课程可以被多个人选)

* */

private Set<StudentBean> studentBeans = new HashSet<StudentBean>(0);

课程xml

<id name="cid" type="java.lang.Integer">

<column name="cid" />

<generator class="native"></generator>

</id>

<property name="cname" type="java.lang.String">

<column name="cname" length="20" />

</property>

<!-- table表示中间表名称 注意 多对多 set属性配置要 动态改变-->

<set name="studentBeans" inverse="false" table="stu_course" lazy="false" cascade="save-update" >

<key column="cid"></key>

<many-to-many column="fid" class="com.bean.StudentBean" />

</set>

学生bean :

public class StudentBean implements java.io.Serializable {

private Integer fid;

private String fname;

private String fsex;

/**

* 学生配置课程表, 一对多(一个学生可以选择多门课程)

* */学生xml文件

private Set<SCourseBean> courseBeans = new HashSet<SCourseBean>(0);

<id name="fid" type="java.lang.Integer">

<column name="fid" />

<generator class="native"></generator>

</id>

<property name="fname" type="java.lang.String">

<column name="fname" length="30" />

</property>

<property name="fsex" type="java.lang.String">

<column name="fsex" length="2" />

</property>

<!-- 默认情况lazy=true延迟加载, 这里的table="stu_course 是指向中间选课记录表 -->

<set name="courseBeans" inverse="false" lazy="false" table="stu_course" cascade="save-update">

<key column="fid"> </key>

<many-to-many column="cid" class="com.bean.SCourseBean" />

</set>

多对对 将产生 中间表 stu_course 表中将包括字段: fid , cid

数据库中建表形式:

create table stu_course(

fid int,

cid int,

primary key(fid,cid)

);

有个联合主键 : primary key(fid,cid)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值