hibernate进阶学习笔记

来源:互联网 发布:windows ime文件 编辑:程序博客网 时间:2024/04/30 17:10

一、hibernate常用配置
1、hibernate.cfg.xml常用配置
此处代码借用别人的博客代码,原文请查看:http://blog.csdn.net/qiaqia609/article/details/9456489/

<!--hibernate.dialect 只是Hibernate使用的数据库方言,就是要用Hibernate连接那种类型的数据库服务器。-->         <property name="dialect">org.hibernate.dialect.MySQLDialect </property>          <!--是否将hibernate运行时的SQL语句输出到控制台,编码阶段便于测试。-->         <property name="show_sql">true </property>        <!-- 输出到控制台的SQL语句是否进行排版,便于阅读。建议设置为true. -->        <property name="format_sql">true</property>        <!-- 可以帮助由java代码生成数据库脚本,进而生成具体的表结构        create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,            哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。        update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),            以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的            行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会。        create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。        val:        validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。         -->        <property name="hbm2dd1.auto">create</property>

hibernate.hbm2ddl.auto的参数配置解释:

validate               加载hibernate时,验证创建数据库表结构create                  每次加载hibernate,重新创建数据库表结构,这就是导致数据库表数据丢失的原因。create-drop        加载hibernate时创建,退出是删除表结构update                 加载hibernate自动更新数据库结构

二、session的简介
1、hibernate的执行流程
(1)应用程序先调用Configration类,该类读取Hibernate的配置文件及映射文件中的信息,并用这些信息生成一个SessionFactpry对象。
(2)然后从SessionFactory对象生成一个Session对象,并用Session对象生成Transaction对象;可通过Session对像get(),load(),save(),update(),delete()和saveOrUpdate()等方法对PO进行加载,保存,更新,删除等操作;在查询的情况下,可通过Session对象生成一个Query对象,然后利用Query对象执行查询操作;如果没有异常,Transaction对象将 提交这些操作结果到数据库中。(session类似于JDBC中的connection,创建一个session对象就相当于创建了一个数据库连接。)

2、什么是session?
(1)session可以理解为一个操作数据库的对象。
(2)session与connection,是多对一的关系,每个session都有一个与之对应的connection,一个connection不同时刻可以供多个session使用。
(3)把对象保存到关系数据库中需要调用session的各种方法,如get(),load(),save(),update(),delete()和saveOrUpdate()等。

三、transaction简介
1、hibernate对数据的操作都是封装在事务当中,并给默认是非自动提交的方式。所以用session保存对象时,如果不开启事务,并且手工提交事务,对象并不会真正保存在数据库中
2、如果想让hibernate想jdbc那样自动提交事物,必须调用session对象的doWork()方法,获得jdbc的connection后,设置为自动提交事务模式。(注意:通常不推荐这样做。)

public void testSaveStudent(){        //生成一个学生对象        Student student=new Student(1,"张三","123456");        //重写doWork()方法。        session.doWork(new Work(){            @Override            public void execute(Connection connection) throws SQLException {                // TODO Auto-generated method stub                connection.setAutoCommit(true);            }        });        //保存对象进入数据库        session.save(student);        session.flush();    }

四、session详解
1、如何获得session对象
(1)openSession
(2)getCurrentSession
如果使用getCurrentSession获得session对象,则需要在hibernate.cfg.xml文件中进行配置:
a、如果是本地事物(JDBC事务)

<property name="hibernate.current_session_context_class">thread</property>

b、如果是全局事物(jta事物)

<property name="hibernate.current_session_context_class">jta</property>

通过两种方式获得session对象的代码示例:

import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.hibernate.service.ServiceRegistry;import org.hibernate.service.ServiceRegistryBuilder;public class SessionTest {    private SessionFactory sessionFactory;//会话工厂    private Session session;    private Transaction transaction;//事物对象    public void testOpenSession(){        //创建配置对象        Configuration config=new Configuration().configure();        //创建服务注册对象        ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();        //创建会话工厂对象        sessionFactory=config.buildSessionFactory(serviceRegistry);        //会话对象        session=sessionFactory.openSession();        if(session!=null){            System.out.println("session创建成功!");        }        else{            System.out.println("session创建失败!");        }    }    public void testGetCurrentSession(){        //创建配置对象        Configuration config=new Configuration().configure();        //创建服务注册对象        ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();        //创建会话工厂对象        sessionFactory=config.buildSessionFactory(serviceRegistry);        //会话对象        session=sessionFactory.getCurrentSession();        if(session!=null){            System.out.println("session创建成功!");        }        else{            System.out.println("session创建失败!");        }    }}

2、openSession和getCurrentSession的区别
(1)getCurrentSession在事务提交或者回滚之后会自动关闭,而openSession需要手动关闭,如果使用openSession没有手动关闭,多次之后会导致连接池溢出。
(2)openSession每次创建的是新的session对象,而getCurrentSession使用的是现有的session对象。

六、hbm配置文件常用设置
1、

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Generated 2017-3-11 11:08:16 by Hibernate Tools 3.4.0.CR1 --><hibernate-mapping><!-- 将一个实体类映射成了数据库里的一张表,这里就是将Student实体类,映射成了STUDENT这张表 -->    <class name="hibernate.Student" table="STUDENT">    <!-- 将实体类属性映射成数据库表里的一个字段 -->        <id name="sid" type="int">            <column name="SID" />            <generator class="assigned" />        </id>        <property name="sname" type="java.lang.String">            <column name="SNAME" />        </property>        <property name="password" type="java.lang.String">            <column name="PASSWORD" />        </property>    </class></hibernate-mapping>

标签的属性如下:

1)package:指定一个包前缀,如果在映射文档中(就是在class标签的那么属性里没有指定全类名)没有指定全限定的类名,就使用这个作为包名,
2)schema:数据库schema的名称
3)catalog:数据库catalog的名称
4)default-cascade:默认的级联风格,默认为none
5)default-access:Hibernate用来访问属性的策略
6)default-lazy:指定了此属性,未明确注明lazy属性的Java属性和集合类,Hibernate会采取的默认使用这个属性加载风格,默认为true
7)auto-import:指定我们是否可以在查询语言中使用非全限定的类名,默认为true,如果项目中有两个同名的持久化类,则最好在这两个类的对应的映射文件中配置为false

Hibernate的子标签class标签:

class 元素用于指定类和表的映射
name:指定该持久化类映射的持久化类的类名
example:

table:指定该持久化类映射的表名, Hibernate 默认以持久化类的类名作为表名
example:

dynamic-insert: 若设置为 true, 表示当(调用Session的save()方法时)保存一个对象时, 会动态生成 insert 语句, insert 语句中仅包含所有取值不为 null 的字段. 默认值为 false
Example:这个跟dynamic-update一个意思
dynamic-update: 若设置为 true, 表示当(调用对象的set()方法)更新一个对象时, 会动态生成 update 语句, update 语句中仅包含所有取值需要更新的字段. 默认值为 false

2、主键生成策略
可查看博客(别人的,这里偷一下懒):http://www.cnblogs.com/hoobey/p/5508992.html

七、hibernate单表操作
1、单一主健
(1)assigned:由java应用程序负责生成(手工赋值)
(2)native:由底层数据库自动生成标示符,如果MySQL就是increment,如果是Oracle就是sequence等等。

2、基本类型
这里写图片描述

3、对象类型
这里写图片描述
注:Mysql不支持标准SQL的CLOB类型,在Mysql中,用TEXT,MEDIUMTEXT及LONGTEXT类型来表示长度超过255的长文本数据。

BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型。BLOB是一 个大文件,典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库)。
写入照片保存到数据库中代码实例:
这里写图片描述

读取照片代码实例:
这里写图片描述

4、组件属性
如果持久化类的属性并不是基本数据类型,也不是一个日期或者字符串常量,而是一个复合类型的对象,例如 private Name name; 那么这就是一个组件属性。
组件属性可以是任何普通的java类对象,在映射文件中则用标签标识,中又可以像那样包含子元素,此外中还可以包含一个子元素用来指向容器实体。

<?xml version="1.0"  encoding="UTF-8"?>    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  <hibernate-mapping package="com">    <class name="Person" table="Person_inf">        <id name="id" column="person_id" type="int">            <generator class="identity" />        </id>        <property name="age" type="int" />        <component name="name" class="Name" unique="true">            <parent name="owner"/>            <property name="first" />            <property name="last" />        </component>    </class></hibernate-mapping>
1 0
原创粉丝点击