Hibernate初探之单表映射(2)

1.hibernate常用配置

hibernate.cfg.xml常用配置

属性名字含义
hibernate.show_sql是否把hibernate运行时的sql语句输出到控制台,编码阶段便于测试
hibernate.format_sql输出到控制台的sql语句是否进行排版,便于阅读。建议设置为true
hbm2ddl.auto可以帮助由java代码生成数据库脚本,进而生成具体的表结构。create、update、crete-drop、validate
hibernate.default_schema默认的数据库
hibernate.dialect配置hibernate数据库方言,hibernate可针对特殊的数据库进行优化
 <property name="show_sql">true</property>
  <property name="format_sql">true</property>
  <property name="hbm2ddl.auto">create</property>
  <property name="hibernate.default_schema">hibername</property>

hbm2ddl.auto create是先删除原有表然后创建新表,update则是更新。default_schema会加一个默认的前缀

2.session简介

关于session的说明:
1.不建议直接使用jdbc的connection操作数据库,而是通过使用session操作数据库;
2.session可以理解为操作数据库的对象;
3.session与connection,是多对一的关系,每个session都有一个与之对应的connection,一个connection不同时刻可以供多个session使用;
4.把对象保存到关系型数据库中需要调用session的各种方法,如:save(),update(),delete(),createQuery()等。

1.Configuration对象:配置文件对象,读取hibernate配置文件xxx.cfg.xml
2.SessionFactory对象:读取对象/关系映射文件 xxx.hbm.xml
3.session对象:数据库链接对象,获得之后可以操作数据库。可以理解为操作数据库的对象
4.Transaction:使用session操作数据库需要开启的事务
这里写图片描述

3. transaction简介

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

//不开启事务(transaction.commit()//提交事务)的方式
 @Test
 public void testSaveStudents(){
  Stusdents s= new Students(1,"ZSF",new Date(),"wudang");
  session.doWork(new Work(){
    @Override
    public void execute(Connection connection) throws SQLException{
      connection.setAutoCommit(true);
    }
  })

  session.save(s);//保存对象进入数据库
  session.flush();//强制发出SQL语句(通过SQL写入SQL)
 }

---自动提交事务(注意:通常并不推荐这样做)---

private Transaction transaction;

transaction  = session.beginTransaction();//打开事务
transaction.commit()//提交事务

需要注意的是:在使用save()方法后并不会真正输出sql语句,需要调用flush()强制输出sql语句才可以。然后因为采用了自动提交方式(setAutoCommit(true)),数据才真正保存在数据库。

4.session详解

如何获得session对象???
(1)openSessionion
(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>
public class TestDemo {

    @Test
    public void testOne() {
        Configuration config=new Configuration().configure();//创建配置对象
        config.addClass(Students.class);
        ServiceRegistry serviceRegistry =new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build();
        //创建服务注册对象
        SessionFactory sessionFactory =config.buildSessionFactory(serviceRegistry);
        //创建会话工厂对象
        Session session =sessionFactory.openSession();//打开会话。
        if(session!=null) {
            System.out.println("创建会话成功");
        }else {
            System.out.println("创建会话失败");
        }   
    }

    @Test
    public void testSecond() {
        Configuration config=new Configuration().configure();//创建配置对象
        config.addClass(Students.class);
        ServiceRegistry serviceRegistry =new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build();
        //创建服务注册对象
        SessionFactory sessionFactory =config.buildSessionFactory(serviceRegistry);
        //创建会话工厂对象
        Session session =sessionFactory.getCurrentSession();
        if(session!=null) {
            System.out.println("创建会话成功");
        }else {
            System.out.println("创建会话失败");
        }   
    }
}

openSession和getCurrentSession的区别
1.getCurrentSession在事务提交或者回滚之后会自动关闭,而openSession则需要你手动关闭,如果使用openSession而没有手动关闭,多次之后会导致连接池溢出。
2.openSession 每次创建的都是一个新的session对象,而getCurrentSession使用的是现有的session对象。openSession使用都是打开一个新的session,使用完需要调用close方法关闭session,
getCurrentSession 是获取当前session对象,连续使用多次时,得到的session都是同一个对象,这就是与openSession的区别之一 。
一般在实际开发中,往往使用getCurrentSession多,因为一般是处理同一个事务,所以在一般情况下比较少使用openSession。
事务:
事务表示一个由一系列的数据库操作组成的不可分割的逻辑单位,其中的操作要么全做要么全都不做
JDBC事务
JDBC事务由Connnection对象控制管理,也就是说,事务管理实际上是在JDBC Connection中实现。事务周期限于Connection的生命周期。
JTA事务
提供了跨数据库连接(或其他JTA资源)的事务管理能力

5.hbm配置文档

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:手工赋值

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值