hibernate环境搭建

定义

orm: Object Relationship Mapping 对象关系映射
对jdbc进行了轻量级的封装。

这里写图片描述

流程

这里写图片描述

jdbc充当了持久化层。

其它ORM

  • mybatis
  • EJB
  • TOPlink

步骤

这里写图片描述

配置文件

  • 文件应该放在classpath根路径下,因为config默认读取该文件的位置是根路径下。

这里写图片描述

这里写图片描述

  1. create : 会根据 .hbm.xml 文件来生成数据表, 但是每次运行都会删除上一次的表 ,重新生成表, 哪怕二次没有任何改变

  2. create-drop : 会根据 .hbm.xml 文件生成表,但是SessionFactory一关闭, 表就自动删除

  3. update : 最常用的属性值,也会根据 .hbm.xml 文件生成表, 但若 .hbm.xml 文件和数据库中对应的数据表的表结构不同, Hiberante 将更新数据表结构,但不会删除已有的行和列

  4. validate : 会和数据库中的表进行比较, 若 .hbm.xml 文件中的列在数据表中不存在,则抛出异常

持久化类的创建原则

  1. 提供一个无参的构造器:使Hibernate可以使用Constructor.newInstance() 来实例化持久化类

  2. 提供一个标识属性(identifier property): 通常映射为数据库表的主键字段. 如果没有该属性,一些功能将不起作用,如:Session.saveOrUpdate()

  3. 为类的持久化类字段声明访问方法(get/set): Hibernate对JavaBeans 风格的属性实行持久化。

    • 公有的类
    • 提供公有的不带参数的默认的构造方法
    • 属性私有
    • 属性setter/getter封装
  4. 使用非 final 类: 在运行时生成代理是 Hibernate 的一个重要的功能. 如果持久化类没有实现任何接口, Hibnernate 使用 CGLIB 生成代理. 如果使用的是 final 类, 则无法生成 CGLIB 代理.

  5. 重写 eqauls 和 hashCode 方法: 如果需要把持久化类的实例放到 Set 中(当需要进行关联映射时), 则应该重写这两个方法

保存对象步骤

    //创建配置对象
Configuration config=new Configuration().configure();

    //创建服务注册对象
    ServiceRegistry serviceRegistry= 
    new  ServiceRegistryBuilder()
    .applySettings(config.getProperties())
    .buildServiceRegistry();       

    //创建会话工厂对象
    SessionFactory sessionFactory=
        config.buildSessionFactory(serviceRegistry);
        //会话对象
        session=sessionFactory.openSession();
        //开启事务
        transaction=session.beginTransaction();`
        //保存对象
        Student s=new Student("xiaoming",2, "男", new Date(), "内蒙古");
        session.save(s);
        transaction.commit();//提交事务
        session.close();//关闭会话
        sessionFactory.close();//关闭工厂

Configuration类

Configuration 类负责管理 Hibernate 的配置信息。包括如下内容:

  1. Hibernate 运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等(对应 hibernate.cfg.xml 文件)。持久化类与数据表的映射关系(*.hbm.xml 文件)

创建 Configuration 的两种方式

  1. 属性文件(hibernate.properties):
    Configuration cfg = new Configuration();

  2. Xml文件(hibernate.cfg.xml)
    Configuration cfg = new Configuration().configure();

  3. Configuration 的 configure 方法还支持带参数的访问:
    File file = new File(“simpleit.xml”);
    Configuration cfg = new Configuration().configure(file);

SessionFactory 接口

  1. 针对单个数据库映射关系经过编译后的内存镜像,是线程安全的。

  2. SessionFactory 对象一旦构造完毕,即被赋予特定的配置信息

  3. SessionFactory是生成Session的工厂

  4. 构造 SessionFactory 很消耗资源,一般情况下一个应用中只初始化一个 SessionFactory 对象。

  5. Hibernate4 新增了一个 ServiceRegistry 接口,所有基于 Hibernate 的配置或者服务都必须统一向这个 ServiceRegistry 注册后才能生效
    Hibernate4 中创建 SessionFactory 的步骤

session接口

  1. Session 是应用程序与数据库之间交互操作的一个单线程对象,是 Hibernate 运作的中心,所有持久化对象必须在 session 的管理下才可以进行持久化操作。此对象的生命周期很短。
  2. Session 对象有一个一级缓存,显式执行 flush 之前,所有的持久层操作的数据都缓存在 session 对象处。相当于 JDBC 中的 Connection。

transaction事务

  1. 代表一次原子操作,它具有数据库事务的概念。所有持久层都应该在事务管理下进行,即使是只读操作。
    Transaction tx = session.beginTransaction();
    常用方法:
    • commit():提交相关联的session实例
    • rollback():撤销事务操作
    • wasCommitted():检查事务是否提交

session

这里写图片描述

这里写图片描述

sessionfactory有两种方法获取session对象,

  1. openSession
  2. getCurrentSession

如果是使用第二种方法,需要在配置文件中进行配置

这里写图片描述

两者的区别

这里写图片描述

这里写图片描述

不开启事务就无法将对象保存到数据库中

hbm文件的配置

hbm.xml配置文档

<hibernate-mapping<br>
    schema="schemaName" //模式的名字
    catalog="catalogName" //目录的名称
    default-cascade="cassade_style" //级联风格
    default-access="field/property/CalssName" //访问策略
    default-lazy="true/false" //加载策略
    package="packagename" //默认包名
/>

<class<br>
    name="ClassName" //对应映射的类<br>
    table="tableName" //对应映射数据库的表<br>
    batch-size="N" //抓取策略,一次抓取多少记录<br>
    where="condition" //条件 eg:抓取条件<br>
    entity-name="EntiyName" //如果需要映射多张表<br>
/>
//表的主键
<id 
    name="propertyName" //对应的属性
    type="typeName" //对应类型
    column="column_nam" //映射数据库中表当中字段名的名称
    length="length" //指定长度
    <generator class="generatorClass"/>//主键生成策略
</id> 

这里写图片描述
由于使用MYSQL,着重讲解一下两个
native:有底层数据库自动生成标识符
assigned:手工赋值

数据类型

这里写图片描述
这里写图片描述

Blob image=student.getPicture();
InputStream input=image.getBinaryStream();

getBinaryStream 返回一个用于从 BLOB 中读取数据的输入流。

这里写图片描述

遇到一个问题,在我向c盘写入文件的时候,提示我没有权限,正如字面所言,那我要怎么解决呢?还没找到办法。

组件属性

:实体类中的某个属性属于用户自定义的类的对象
<component name = "address" class="Address">
   <property name ="postcode" column="POSTCODE"></property>
   <property name ="phone" column="PHONE"></property>
   <property name ="address" column="ADDRESS"></property>
</component>

这里写图片描述

这里写图片描述
这里写图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值