(二)hibernate进阶

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&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进阶的更多相关文章
- (Hibernate进阶)Hibernate系列——总结篇(九)
这篇博文是hibernate系列的最后一篇,既然是最后一篇,我们就应该进行一下从头到尾,整体上的总结,将这个系列的内容融会贯通. 概念 Hibernate是一个对象关系映射框架,当然从分层的角度看,我 ...
- 【算法系列学习三】[kuangbin带你飞]专题二 搜索进阶 之 A-Eight 反向bfs打表和康拓展开
[kuangbin带你飞]专题二 搜索进阶 之 A-Eight 这是一道经典的八数码问题.首先,简单介绍一下八数码问题: 八数码问题也称为九宫问题.在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的 ...
- 重温ASP.NET WebAPI(二)进阶
重温ASP.NET WebAPI(二)进阶 介绍 本文为个人对WebApi的回顾无参考价值. 本文内容: Rest和UnitOfWork 创建WebAPi的流程 IOC-Unity的使用 MEF ...
- 【SSH进阶之路】Struts + Spring + Hibernate 进阶开端(一)
[SSH进阶之路]Struts + Spring + Hibernate 进阶开端(一) 标签: hibernatespringstrutsssh开源框架 2014-08-29 07:56 9229人 ...
- Hibernate进阶学习4
Hibernate进阶学习4 深入学习hibernate的查询语句 测试HQL查询 package com.hibernate.test; import com.hibernate.domain.Cu ...
- Hibernate进阶学习3
Hibernate进阶学习3 测试hibernate的多表关联操作(一对多,多对一,多对多) 表之间的关系主要在类与元数据配置文件中体现 package com.hibernate.domain; i ...
- amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules
amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules 一.总结 1.见名知意:见那些class名字知意,见函数名知意,见文件名知意 例如(HISTORY.md Web 组件更新历史 ...
- amazeui学习笔记二(进阶开发4)--JavaScript规范Rules
amazeui学习笔记二(进阶开发4)--JavaScript规范Rules 一.总结 1.注释规范总原则: As short as possible(如无必要,勿增注释):尽量提高代码本身的清晰性. ...
- amazeui学习笔记二(进阶开发3)--HTML/CSS规范Rules
amazeui学习笔记二(进阶开发3)--HTML/CSS规范Rules 一.总结 1.am:以 am 为命名空间 2.模块状态: {命名空间}-{模块名}-{状态描述} 3.子模块: {命名空间}- ...
- amazeui学习笔记二(进阶开发2)--Web组件简介Web Component
amazeui学习笔记二(进阶开发2)--Web组件简介Web Component 一.总结 1.amaze ui:amaze ui是一个web 组件, 由模板(hbs).样式(LESS).交互(JS ...
随机推荐
- 把json格式的字符串转换成javascript对象或数组
第一种 JSON.parse(jsonString) 第二种 eval("("+jsonString+")") 第三种 var obj=(function ...
- linux基础命令学习 (十一)系统管理命令
stat 显示指定文件的详细信息,比ls更详细 who 显示在线登陆用户 whoami 显示当前操作用户 hostname ...
- 客户端获取ip
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- JS 判断PC、android、ios、微信浏览器
1.通过js userAgent来判断 <h1>判断访问此链接的操作系统</h1> <script> var Agents = new Array("An ...
- 移动应用安全开发指南(Android)--完结篇
如果IE显示格式不正常,请使用chrome浏览器 1.认证和授权 概述 认证是用来证明用户身份合法性的过程,授权是用来证明用户可以合法地做哪些事的过程,这两个过程一般是在服务器端执行的,但也有的APP ...
- VS2010 + IDA SDK 搭建IDA Plugin开发环境
http://www.h4ck.org.cn/2011/11/vs2010-idasdk6-2-ida-plugin-development/ 1. 执行菜单的File->New->Pro ...
- PHP中getenv()和$_SERVER的区别
PHP中getenv()和$_SERVER的用法区别: getenv 取得系统的环境变量,环境变量的格式为name=value. 语法: string getenv(string varname); ...
- MYSQL SELECT 过程 转
本文从一个select语句的执行过程出发, 遍历MySQL的多个几子系统. 先放图一张, 按图索骥开始我们的历险. <ignore_js_op> 当客户端连接上MySQL服务端之后 ...
- 測试oracle 11g cluster 中OLR的重要性
測试oracle 11g cluster 中OLR的重要性 called an Oracle Local Registry (OLR): each node in a cluster has a ...
- java反射机制简单介绍
1.字节码.所谓的字节码就是当java虚拟机载入某个类的对象时,首先须要将硬盘中该类的源码编译成class文件的二进制代码(字节码),然后将class文件的字节码载入到内存中,之后再创建该类的对象 2 ...






