1.hibernate.cfg.xml常用配置
以上节代码为例
<session-factory>

    <property name="connection.username">root</property>
<property name="connection.password">123</property>
<property name="connection.driver.class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///hibernate?useUnicode=true&amp;characterEncoding=UTF-8</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hbm2ddl.auto">create</property> <mapping resource="Students.hbm.xml" />
</session-factory>

hbm2ddl.auto:如何将数据生成的表插入数据库
create:覆盖原表(删除原表,重新生成)
update:更新(原有的表结构不会被删除)
create-drop:先生成,后删除。
validate:将现有的表结构和原有的表结构进行验证,如果不同,就不创建新的表结构。
default_schema:填写数据库名
生成的SQL语句中会在表名和表结构之前加上数据库名。
2.session简介
首先要明白Hibernate是对JDBC的一个封装,所以不建议使用jdbc的connection操作数据库,而是通过使用session操作数据库。
2.1. 所以Session可以理解为操作数据库的对象。要使用Hibernate操作数据库,就先要获得Session的实例。
2.2. session与connection,是多对一的关系。每个session都有一个与之对应的connection,一个connection不同时刻可以供多个session使用。
2.3. 把对象保存在关系数据库中需要调用session的各种方法,如:save(),update(),delete(),createQuery()等。

要特别注意的是:当执行某一个Session对象的方法时,必须要开启一个事务。也就是说,这些方法要封装在事务中。在执行这些方法之后要提交事务,再关闭Session。

结合上节代码:
package hibernate_01;

import java.util.Date;

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;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; //测试的源程序要写在新建的Source Folder里 //测试类
public class StudentsTest { private SessionFactory sessionFactory;
private Session session;
private Transaction transaction; @Before
public void init(){
//创建配置对象
Configuration config =new Configuration().configure();
//创建服务注册对象
ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
//创建会话工厂对象
sessionFactory=config.buildSessionFactory(serviceRegistry);
//会话对象
session =sessionFactory.openSession();
//开启事务
transaction =session.beginTransaction(); } @After
public void destory(){
transaction.commit();//提交事务
session.close();//关闭会话
sessionFactory.close();//关闭会话工厂
} @Test
public void testSaveStudents(){ //生成学生对象
Students s=new Students(1,"张三","男",new Date(),"山东");
//保存对象进数据库
session.save(s);
} }
3.transaction简介

3.1  hibernate默认不自动提交事务,将<2.session简介>中测试类   StudentsTest  中的的事务相关代码注释


//开启事务
//transaction =session.beginTransaction();

@After
public void destory(){
//transaction.commit();//提交事务

运行后控制台如下输出(没有insert 代码)

说明表输入失败

要想不开启事务向数据库加入数据,可采用如下方法:

在save()方法之前带调用doWork()方法,重写其execute()方法,设置自动提交,最后不要忘了session提交后用flush()方法强制输出sql语句。

@Test
public void testSaveStudents(){ //生成学生对象
Students s=new Students(1,"张三","男",new Date(),"山东"); session.doWork(new Work(){ @Override
public void execute(Connection connection) throws SQLException {
// TODO Auto-generated method stub
connection.setAutoCommit(true);
}
});
//保存对象进数据库
session.save(s);
//强制输出sql语句
session.flush();
}

控制台输出sql语句,表结构创建完成。

4.session详解
4.1. 获得session对象的两种方法
package hibernate_01;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;//不要导错了
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.Test; public class SessionTest { //为方便,将所有方法写在@Test里
@Test
public void testOpenSession(){
//获得配置对象
Configuration config = new Configuration().configure();
//获得服务注册对象
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
//获得sessionFactory对象
SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);
//获得session对象
Session session =sessionFactory.openSession(); if(session!=null){
System.out.println("session创建成功!");
}else{
System.out.println("session创建失败!");
}
} @Test
public void testGetCurrentSession(){
//获得配置对象
Configuration config = new Configuration().configure();
//获得服务注册对象
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
//获得sessionFactory对象
SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);
//获得session对象
Session session =sessionFactory.getCurrentSession(); if(session!=null){
System.out.println("session创建成功!");
}else{
System.out.println("session创建失败!");
}
}
}

getCurrentSession配置本地事务(在hibernate.cfg.xml文件中进行配置 )


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

4.2.两种方法的区别

4.2.1 验证openSession()方法创建对象hashCode不同

@Test
public void testSaveStudentsWithOpenSession(){
//获得配置对象
Configuration config = new Configuration().configure();
//获得服务注册对象
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
//获得sessionFactory对象
SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);
//获得session对象
Session session1=sessionFactory.openSession();
//开启事务
Transaction transaction = session1.beginTransaction();
//生成一个学生对象
Students s=new Students(1,"李四","男",new Date(),"北京");
session1.doWork(new Work(){ @Override
public void execute(Connection connection) throws SQLException {
// TODO Auto-generated method stub
System.out.println("connection hashCode:" +connection.hashCode());
} });
session1.save(s);
// session1.close();
transaction.commit();//提交事务 Session session2=sessionFactory.openSession();
transaction = session2.beginTransaction();
s=new Students(2,"王五","男",new Date(),"武汉");//表的主键问题要主意
session2.doWork(new Work(){ @Override
public void execute(Connection connection) throws SQLException {
// TODO Auto-generated method stub
System.out.println("connection hashCode:" +connection.hashCode());
} });
session2.save(s);
transaction.commit();//提交事务 }

4.2.2 创建 session方式不同

Session session1 =sessionFactory.openSession();
Session session2 =sessionFactory.openSession(); System.out.println(session1==session2); //false
Session session1 =sessionFactory.getCurrentSession();
Session session2 =sessionFactory.getCurrentSession(); System.out.println(session1==session2); //true
5.对象关系映射(hbm文档)常用配置
5.1 mapping标签

5.2 class标签

5.3  id标签

5.4  主键生成策略



(二)hibernate进阶的更多相关文章

  1. (Hibernate进阶)Hibernate系列——总结篇(九)

    这篇博文是hibernate系列的最后一篇,既然是最后一篇,我们就应该进行一下从头到尾,整体上的总结,将这个系列的内容融会贯通. 概念 Hibernate是一个对象关系映射框架,当然从分层的角度看,我 ...

  2. 【算法系列学习三】[kuangbin带你飞]专题二 搜索进阶 之 A-Eight 反向bfs打表和康拓展开

    [kuangbin带你飞]专题二 搜索进阶 之 A-Eight 这是一道经典的八数码问题.首先,简单介绍一下八数码问题: 八数码问题也称为九宫问题.在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的 ...

  3. 重温ASP.NET WebAPI(二)进阶

    重温ASP.NET WebAPI(二)进阶   介绍 本文为个人对WebApi的回顾无参考价值. 本文内容: Rest和UnitOfWork 创建WebAPi的流程 IOC-Unity的使用 MEF ...

  4. 【SSH进阶之路】Struts + Spring + Hibernate 进阶开端(一)

    [SSH进阶之路]Struts + Spring + Hibernate 进阶开端(一) 标签: hibernatespringstrutsssh开源框架 2014-08-29 07:56 9229人 ...

  5. Hibernate进阶学习4

    Hibernate进阶学习4 深入学习hibernate的查询语句 测试HQL查询 package com.hibernate.test; import com.hibernate.domain.Cu ...

  6. Hibernate进阶学习3

    Hibernate进阶学习3 测试hibernate的多表关联操作(一对多,多对一,多对多) 表之间的关系主要在类与元数据配置文件中体现 package com.hibernate.domain; i ...

  7. amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules

    amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules 一.总结 1.见名知意:见那些class名字知意,见函数名知意,见文件名知意 例如(HISTORY.md Web 组件更新历史 ...

  8. amazeui学习笔记二(进阶开发4)--JavaScript规范Rules

    amazeui学习笔记二(进阶开发4)--JavaScript规范Rules 一.总结 1.注释规范总原则: As short as possible(如无必要,勿增注释):尽量提高代码本身的清晰性. ...

  9. amazeui学习笔记二(进阶开发3)--HTML/CSS规范Rules

    amazeui学习笔记二(进阶开发3)--HTML/CSS规范Rules 一.总结 1.am:以 am 为命名空间 2.模块状态: {命名空间}-{模块名}-{状态描述} 3.子模块: {命名空间}- ...

  10. amazeui学习笔记二(进阶开发2)--Web组件简介Web Component

    amazeui学习笔记二(进阶开发2)--Web组件简介Web Component 一.总结 1.amaze ui:amaze ui是一个web 组件, 由模板(hbs).样式(LESS).交互(JS ...

随机推荐

  1. 把json格式的字符串转换成javascript对象或数组

      第一种 JSON.parse(jsonString) 第二种 eval("("+jsonString+")") 第三种 var obj=(function ...

  2. linux基础命令学习 (十一)系统管理命令

    stat              显示指定文件的详细信息,比ls更详细 who               显示在线登陆用户 whoami          显示当前操作用户 hostname   ...

  3. 客户端获取ip

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. JS 判断PC、android、ios、微信浏览器

    1.通过js userAgent来判断 <h1>判断访问此链接的操作系统</h1> <script> var Agents = new Array("An ...

  5. 移动应用安全开发指南(Android)--完结篇

    如果IE显示格式不正常,请使用chrome浏览器 1.认证和授权 概述 认证是用来证明用户身份合法性的过程,授权是用来证明用户可以合法地做哪些事的过程,这两个过程一般是在服务器端执行的,但也有的APP ...

  6. VS2010 + IDA SDK 搭建IDA Plugin开发环境

    http://www.h4ck.org.cn/2011/11/vs2010-idasdk6-2-ida-plugin-development/ 1. 执行菜单的File->New->Pro ...

  7. PHP中getenv()和$_SERVER的区别

    PHP中getenv()和$_SERVER的用法区别: getenv 取得系统的环境变量,环境变量的格式为name=value. 语法: string getenv(string varname); ...

  8. MYSQL SELECT 过程 转

      本文从一个select语句的执行过程出发, 遍历MySQL的多个几子系统. 先放图一张, 按图索骥开始我们的历险. <ignore_js_op>   当客户端连接上MySQL服务端之后 ...

  9. 測试oracle 11g cluster 中OLR的重要性

     測试oracle 11g cluster 中OLR的重要性 called an Oracle Local Registry (OLR): each node in a cluster has a ...

  10. java反射机制简单介绍

    1.字节码.所谓的字节码就是当java虚拟机载入某个类的对象时,首先须要将硬盘中该类的源码编译成class文件的二进制代码(字节码),然后将class文件的字节码载入到内存中,之后再创建该类的对象 2 ...