Hibernate原理和第一个Hibernate实例

来源:互联网 发布:织梦cms演示站 编辑:程序博客网 时间:2024/05/16 09:44
 

Hibernate原理和基本操作总结

一  基础介绍

1.引入

(1)引入的原因:模型不匹配(阻抗不匹配)

    Java面向对象语言,对象模型,主要概念有:继承、关联、多态等;数据库的关系模型,主要概念有:表、主键、外键

(2)解决的办法

    使用JDBC手工转换:关系模型转换成了对象模型、对象模式转换为关系模型

    使用对象关系映射框架ORM(Object Relation Mapping对象关系映射)来解决,主流的ORM框架有Hibernate TopLink OJB

2.安装配置

(1)下载地址:http://www.hibernate.org

(2)将下载目录/hibernate3.jar和/lib下的hibernate运行时必须的包加入classpath中:

    antlr.jar,cglib.jar,asm.jar,commons-collections.jar,commons-logging.jar,jta.jar,dom4j.jar

(3)配置文件hibernate.cfg.xml

    包括:驱动、url 、用户名、密码、方言

    实例:

    <hibernate-configuration>

    <session-factory>

       <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

       <property name="hibernate.connection.url">jdbc:mysql:///demo</property>

       <property name="hibernate.connection.username">root</property>

       <property name="hibernate.connection.password">qiao</property>

       <!-- 方言  针对哪个数据库Mysql-->

       <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

    </session-factory>

</hibernate-configuration>

(4)映射文件

    把实体类中的属性映射成二维表存储

<hibernate-mapping package="com.hbsi.domain">

    <class name="java中是实体类的类名2" table="表名">

<!-- 将java类中的属性映射成表的字段 -->

       <id name="id">

           <generator class="native"/>

       </id>

       <property name="java类中普通属性的名字"/>

    </class>

</hibernate-mapping>

二  基本操作总结

1.创建一个实体类User

2.将hibernate所需的jar包构建到项目中

MySQL驱动 

hibernate3.jar

lib/required/所有jar文件

       lib/jpa/jar文件

3.配置文件

    (1)配置文件的使用

默认的名字是hibernate.cfg.xml

        也可以使用Hibernate.properties

        如果两种都配,前者优先

(2)配置文件的信息

    驱动、url、用户名、密码、方言(用的是什么数据库)、自动的创建表、显示在hibernate工作的过程中产生的sql语句显示出来、指定映射文件的为

    例子: 

<hibernate-configuration>

    <session-factory>

       <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

       <property name="hibernate.connection.url">jdbc:mysql:///demo</property>

       <property name="hibernate.connection.username">root</property>

       <property name="hibernate.connection.password">qiao</property>

      

       <!-- 方言  针对哪个数据库Mysql-->

       <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

      

       <!-- 在程序运动的时候,增加自动创建表的属性,在程序终止 的时候销毁,但是在表格再次使用时,会重新建 -->

       <property name="hibernate.hbm2ddl.auto">create</property>

      

       <!-- 执行的sql语句显示出来 -->

       <property name="hibernate.show_sql">true</property>

      

       <!-- 指定映射文件的位置 -->

       <mapping resource="com/hbsi/domain/User.hbm.xml"/>

    </session-factory>

</hibernate-configuration>

 

4.映射文件  ---  将实体类和二维的关系表关联起来

    命名的规范:User  ----  User.hbm.xml

    例子:

    <hibernate-mapping package="com.hbsi.domain">  ----  指定java实体类的包名

    <class name="User" table="user"> --- 说明实体类怎么映射成二维表

       <id name="id" column=”id”>

           <!-- 解决主键的生成器,classs中 native是主键的生成器 自动递增-->

           <generator class="native"/>

       </id>

       <property name="name" />

       <property name="birthday" />

    </class>

</hibernate-mapping>

5.编写代码

    public static void main(String[] args) {

       //  使用Hibernate完成将对象存入到表中

       //配置对象

       Configuration cfg = new Configuration();

       cfg.configure();//用来完成Hibernate的初始化---用来读取配置文件中的信息,可以指定配置文件的位置  cfg.configure("");

       //得到sessionFactoroy的工厂对象,相当于DirverManager,

       SessionFactory sf = cfg.buildSessionFactory();

      

       //通过sessionFactory得到session,与会话中的session没有关系

       Session s =sf.openSession();

   

       //开启事务

       Transaction tx = s.beginTransaction();

      

       //得到User对象

       User user = new User();

       user.setName("Tom");

       user.setBirthday(new Date());

      

       s.save(user);

       tx.commit();//提交事务

       s.close();

      

       System.out.println("end");

      

    }

 

6.遇到的问题

(1)驱动找不到

(2)没有找到配置文件  unknown entity  不认识User实体类,原因没有在配置文件中指明配置文件的位置,应该增加一条语句:

    <!-- 指定映射文件的位置 -->

    <mapping resource="com/hbsi/domain/User.hbm.xml"/>

(3)Table demo.user doesnot exist

    在配置文件中增加:

       <property name="hibernate.hbm2ddl.auto"></property>

    它的取值有:

    (1)<property name="hibernate.hbm2ddl.auto"> create-drop </property>

create-drop:表示在hebarinate初始化时创建表格,程序运行结束的时候会删除相应的表格,在实际项目中不用

    (2)<property name="hibernate.hbm2ddl.auto">create</property>

在hibernate初始化时会创建表格,在运行结束之后不删除表格,而是在下一次运行的时候如果有旧的删掉,没有旧的,重新建表格

(3)<property name="hibernate.hbm2ddl.auto">update</property>

只是根据映射文件去和数据库中的表对应起来,如果不一致,就更新表的结构

 

(4)<property name="hibernate.hbm2ddl.auto">validate</property>

校验映射文件和数据库中的表是不是能对应起来,不能对应报错,实际中常用

(4)表建好了,但是表格中没有记录,可以想到是事务的回滚所致

    <!-- 执行的sql语句显示出来 -->

       <property name="hibernate.show_sql">true</property>

开启事务

       Transaction tx = s.beginTransaction();

提交事物

tx.commit();//提交事物

 

原创粉丝点击