Hibernate单表映射

本文详细介绍了使用 Hibernate 进行对象关系映射的基本流程,包括配置文件的读取、SessionFactory 和 Session 的创建、事务管理、对象保存方法及主键生成策略,并对比了 openSession 与 getCurrentSession 的不同。

这里写图片描述
通过Configuration().configure()读取并解析hibernate.cfg.xml配置文件,由hibernate.cfg.xml中的< mapping resource=”Student.hbm.xml”/>读取并解析映射信息,通过config.buildSessinFactory()创建SessionFactory,通过SessionFactory创建Session对象,通过session.beginTransaction()开启事务,由Session执行save,delete,update,get操作,然后提交事务,关闭会话,关闭会话工厂

Session

可以理解为操作数据库的对象
session和Jdbc中的connection是多对一的关系,每一个session都有一个与之对应的connection,一个connection不同时刻可以供多个session使用
把对象保存在关系数据库中需要调用session的各种方法,如:save(),update(),delete(),createQuery()等。

如何获得session对象?
1) openSession
2) getCurrentSession

如果使用getCurrentSession需要在hibernate.cfg.xml文件中进行配置:
如果是本地事务 ( jdbc事务)

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

如果是全局事务(jta事务)

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

两种方式的区别
1.getCurrentSession在事务提交或者回滚之后会自动关闭,而openSession需要手动关闭,如果使用openSession而没有手动关闭,多次之后会导致连接池溢出
2.openSession每次创建新的Session对象,getCurrentSession使用现有的Session对象

transaction

hibernate对数据的操作都是封装在事务当中,并且默认是非自动提交的方式。所以用session保存对象时,如果不开启事务,并且手工提交事务,对象不会真正保存在数据库中。
如果想让hibernate向jdbc那样自动提交事务吗,必须调用session对象的doWork()方法,获得jdbc的connection后,设置其为自动提交事务模式(不建议这样做)

session.doWork(new Work(){
            @Override
            public void execute(Connection connection) throws SQLException {
                // TODO Auto-generated method stub
                connection.setAutoCommit(true);
            }
        });
        session.save(s);//保存对象进数据库
        session.flush();

单一主键

assigned 由Java应用程序负责生成(手工赋值)
native 由底层数据库自动生成标示符,如果是MySQL就是increment,如果是Oracle就是sequence,等等

基本类型

这里写图片描述

这里写图片描述

对象类型

这里写图片描述

组件属性

实体类中的某个属性属于用户白定义的类的对象。

新建地址类Address,封装属性postcode,phone,address
在对象-关系映射表中添加

<component name="address" class="Address">
    <property name="postcode" column="POSTCODE"> </property>
    <property name="phone" column="PHONE"> </property>
    <property name="address" column="ADDRESS"> </property>
</component>

测试方法

    Student s=new Student(1, "张三", "男", new Date(), "北京");
    Address address=new Address("0001", "12315", "sdafji");
    s.setAddress(address);
    session.save(s);

get和load的区别

在不考虑缓存的情况下,get方法在被调用之后会立即向数据库发送SQL语句,返回持久化对象,查询数据库中不存在的数据时,get方法返回null
load方法在被调用之后返回一个代理对象,该代理对象只保存了实体对象的ID,直到使用对象的非主键属性时才会发送SQL语句,查询不存在的数据时,load方法抛出异常org.hibernate.ObjectNotFoundException

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值