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)
|