hibernate 流程及 几种关系总结

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)

 

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值