Hibernate:是开源的ORM框架技术,对jdbc进行了非常轻量级的对象封装,处于业务逻辑层和数据库层之间,称作持久化层。

持久化层的作用:把程序生成的对象持久化到数据库,也就是保存到数据库。

 hibernate执行流程

1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件(下述代码简略解释)

*****

public Configuration configure() throws HibernateException {
configure( "/hibernate.cfg.xml" );
return this;
}
*****

    public Configuration configure(String resource) throws HibernateException {
LOG.configuringFromResource( resource );
InputStream stream = getConfigurationInputStream( resource );
return doConfigure( stream, resource );
}
*****

protected Configuration doConfigure(InputStream stream, String resourceName) throws HibernateException {
try {
ErrorLogger errorLogger = new ErrorLogger( resourceName );
Document document = xmlHelper.createSAXReader( errorLogger, entityResolver )
.read( new InputSource( stream ) );
if ( errorLogger.hasErrors() ) {
throw new MappingException( "invalid configuration", errorLogger.getErrors().get( 0 ) );
}
doConfigure( document );
}
catch (DocumentException e) {
throw new HibernateException( "Could not parse configuration: " + resourceName, e );
}
finally {
try {
stream.close();
}
catch (IOException ioe) {
LOG.unableToCloseInputStreamForResource( resourceName, ioe );
}
}
return this;
}
*****

protected Configuration doConfigure(Document doc) throws HibernateException {
Element sfNode = doc.getRootElement().element( "session-factory" );
String name = sfNode.attributeValue( "name" );
if ( name != null ) {
properties.setProperty( Environment.SESSION_FACTORY_NAME, name );
}
addProperties( sfNode );
parseSessionFactory( sfNode, name ); Element secNode = doc.getRootElement().element( "security" );
if ( secNode != null ) {
parseSecurity( secNode );
} LOG.configuredSessionFactory( name );
LOG.debugf( "Properties: %s", properties ); return this;
}
*****

private void addProperties(Element parent) {
Iterator itr = parent.elementIterator( "property" );
while ( itr.hasNext() ) {
Element node = (Element) itr.next();
String name = node.attributeValue( "name" );
String value = node.getText().trim();
LOG.debugf( "%s=%s", name, value );
properties.setProperty( name, value );
if ( !name.startsWith( "hibernate" ) ) {
properties.setProperty( "hibernate." + name, value );
}
}
Environment.verifyProperties( properties );
}
*****

    private void parseSessionFactory(Element sfNode, String name) {
Iterator elements = sfNode.elementIterator();
while ( elements.hasNext() ) {
Element subelement = (Element) elements.next();
String subelementName = subelement.getName();
if ( "mapping".equals( subelementName ) ) {
parseMappingElement( subelement, name );
}
else if ( "class-cache".equals( subelementName ) ) {
String className = subelement.attributeValue( "class" );
Attribute regionNode = subelement.attribute( "region" );
final String region = ( regionNode == null ) ? className : regionNode.getValue();
boolean includeLazy = !"non-lazy".equals( subelement.attributeValue( "include" ) );
setCacheConcurrencyStrategy( className, subelement.attributeValue( "usage" ), region, includeLazy );
}
else if ( "collection-cache".equals( subelementName ) ) {
String role = subelement.attributeValue( "collection" );
Attribute regionNode = subelement.attribute( "region" );
final String region = ( regionNode == null ) ? role : regionNode.getValue();
setCollectionCacheConcurrencyStrategy( role, subelement.attributeValue( "usage" ), region );
}
}
}

总结来说就是在Configuration类中有一个properties变量,通过类加载器动态的加载xml中配置的变量(session-factory,property,mapping),并且以key,value键值对的方式保存在properties中。

2.由hibernate.cfg.xml中的<mapping resource="com/xx/User.hbm.xml"/>读取并解析映射信息或者<mapping class="xxx">读取解析entity注释信息

3.通过config.buildSessionFactory();//创建SessionFactory

    public SessionFactory buildSessionFactory(ServiceRegistry serviceRegistry) throws HibernateException {
LOG.debugf( "Preparing to build session factory with filters : %s", filterDefinitions ); buildTypeRegistrations( serviceRegistry );
secondPassCompile();
if ( !metadataSourceQueue.isEmpty() ) {
LOG.incompleteMappingMetadataCacheProcessing();
} validate(); Environment.verifyProperties( properties );
Properties copy = new Properties();
copy.putAll( properties );
ConfigurationHelper.resolvePlaceHolders( copy );
Settings settings = buildSettings( copy, serviceRegistry ); return new SessionFactoryImpl(
this,
mapping,
serviceRegistry,
settings,
sessionFactoryObserver
);
}

简单来说就是SessionFacrory是一个重量级的容器,里面包含了配置文件的所有信息,ServiceRegistry等等。

4.sessionFactory.openSession();//打开Sesssion

* JDBC {@link Connection connection(s} will be obtained from the
* configured {@link org.hibernate.service.jdbc.connections.spi.ConnectionProvider} as needed
* to perform requested work.

通过org.hibernate.service.jdbc.connections.spi.ConnectionProvider配置返回一个JDBC Connection

5.session.beginTransaction();//创建事务Transation

6.persistent operate持久化操作 //一般指Save这个方法

7.session.getTransaction().commit();//提交事务

8.关闭Session

9.关闭SesstionFactory

操作示例:

public class test_add {
SessionFactory sessionFactory; @Before
public void sessionFacroty() {
Configuration cfg = new Configuration(); cfg.configure(); ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(cfg.getProperties()).build(); try {
sessionFactory = cfg.buildSessionFactory(sr);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
} @Test
public void add() {
Session session = sessionFactory.openSession();
session.beginTransaction();
Students stu = new Students();
session.save(stu);
session.getTransaction().commit();
session.close();
}
}

Configuration:用来创建SessionFactory实例

常见方法:Configuration configure()   :Use the mappings and properties specified in an application resource named hibernate.hbm.xml

SessoinFactory:一个application对应一个SessionFactory实例,它被创建以后其内部的hibernate配置和映射关系是固定不变的,对于请求,它会创建Session实例

常用方法:Session  openSession()

Sessoin  getCurrentSession()

Session:对于SessionFactory建立的每个轻量级的Session,相当于对数据库的一次Connecion,每当需要与数据库进行交互的时候就实例化一个Session,Session中封装了持久化实例。

常见方法:void save()

void update()

void delete()

SQLQuery createSQLQuery(String queryString)   Create a SQLQuery instance for the given SQL query string.

Object get(Class clazz, Serializable id)     Return the persistent instance of the given entity class with the given identifier

Transaction:对数据库操作的封装对象,在session执行CRUB操作后,必须手动提交事务,对象才会写入数据库,也可以设置自动提交:

注:使用Session的doWork方法,重写execute方法,虽然不用提交事务,但Sesion.save()后需要Session.flush();

常用方法:void begin()

void commit()

hibernate.cfg.xm常见配置

详情见:http://www.cnblogs.com/kundeg/p/7153452.html

hibernate.show_sql--打印出sql语句

hibernate.format_sql--格式化sql语句

hibernate.dialect-数据库方言,针对不同数据库不同

hbm2ddl.auto : create表示每次生成新的表结构,删除已存在的表再创建新表

update,表示在原有表结构的基础上进行更新,保留原有的数据,对表结构进行更新,并插入新的数据

connection.url  connection.username  connection.password connection.driver_name

持久化类设计原则:

1.公有的类,私有属性

2.提供公有的不带参数的默认的构造方法

3.属性setter、getter封装

4.最好有像id一样作为标识符的属性

 Junit测试

@Before:初始化方法(表示在测试前会先执行before方法进行初始化)

@Test:要测试的方法

@After:释放资源。

openSession与getCurrentSession的区别

1.getCurrentSession在事务提交或者回滚之后会自动关闭,而openSession需要手动关闭,否者会造成连接池溢出,

2.openSession每次创建新的Session对象(对应不同的Connection),getCurrentSession使用现有的Session对象(对应相同的Connection)。

3.使用getCurrentSession获得Session还需要在cfg中配置:

如果是本地事物(jdbc):<property name="hibernate.current_session_context_class">thread</property>

如果是全局事务(jta):<property name="hibernate,current_session_context_class">jta</property>

Session与Connection的关系

一个Session对应一个Connection而一个Connection可以在不同时刻对应多个Session。

Session中get方法和load方法的区别

1.在不考虑缓存的情况下,get方法会在调用之后立即向数据库发出sql语句,返回持久化对象。 load方法会在调用之后返回一个代理对象。 该代理对象只保存了实体对象的id,直到使用对象的非主键属性时才会发出sql语句。

2.在大部分情况下load的延迟加载机制比get好,但是load会产生LazyInitializationException,当在session关闭后才调用load加载对象的其他属性的时候就会报出这个异常。

3.查询数据库中不存在的数据时,get方法会暴NullPointException,而load方法会抛出ObjectNotFound异常

更加具体的实例http://www.cnblogs.com/xiaoluo501395377/p/3371776.html

CLOB和BLOB的区别

1.CLOB使用CHAR来保存数据。 如:保存XML文档。

2. BLOB就是使用二进制保存数据。 如:保存位图,声音

3.都可以保存大对象

assigned与native区别

assigned:由java应用程序负责生成(手工赋值),没有赋值的话,int型默认为0;其他类型会报错

native:由底层数据库自动生成标识符,如果是MySQL就是increment,如果是Oracle就是sequence

hql与sql区别

1.hql操作的目标是持久化对象,sql操作的目标是数据库,在语法结构上大致相同。

2.由于第一条区别的存在,hql语句对大小写敏感,而sql语句则不敏感

hibernate 基础的更多相关文章

  1. hibernate基础dao类

    此文章是基于 搭建SpringMVC+Spring+Hibernate平台 功能:数据库的保存.更新.删除:sql.hql查询:分页查询:调用存储过程 创建hibernate基础dao类: BaseD ...

  2. hibernate基础(1)

    hibernate基础1.hibernate介绍与动手入门体验  问题:模型不匹配(java对象模型与数据库关系模型不匹配)  解决: 1.使用JDBC手工转换        2.使用ORM(Obje ...

  3. Hibernate.基础篇《二》. getOpenSession() 和 getCurrentSession() - 1

    Hibernate.基础篇<二>. getOpenSession() 和 getCurrentSession() - 1 说明: 在Hibernate应用中,Session接口的使用最为广 ...

  4. Hibernate.基础篇《一》.Hibernate工具类.

    Hibernate.基础篇<一>.Hibernate工具类. 话述: Hibernate.基础篇第一篇,前面是代码.后面再加理论&实践. Hibernate使用的版本是:5.x,在 ...

  5. Hibernate学习笔记2.1(Hibernate基础配置)

    Hibernate基础配置 1.<property name="hbm2ddl.auto">update</property> 在SessionFactor ...

  6. Hibernate入门1. Hibernate基础知识入门

    Hibernate入门1. Hibernate基础知识入门 20131127 前言: 之前学习过Spring框架的知识,但是不要以为自己就可以说掌握了Spring框架了.这样一个庞大的Spring架构 ...

  7. Hibernate基础学习2

    Hibernate基础学习2 测试hibernate的一级缓存,事务以及查询语句 1)Hibernate的一些相关概念 hibernate的一级缓存 1)缓存是为了提高该框架对数据库的查询速度 2)一 ...

  8. Hibernate 基础配置及常用功能(三)

    本章重点讲述Hibernate对象的三种状态以及如何配置二级缓存 有关Hibernate的三种状态如何相互转换网上都能查到,官方文档描述的也比较详细.这里主要是针对几个重点方法做代码演示. 一.状态转 ...

  9. Hibernate基础学习(五)—对象-关系映射(下)

    一.单向n-1 单向n-1关联只需从n的一端可以访问1的一端. 域模型: 从Order到Customer的多对一单向关联.Order类中定义一个Customer属性,而在Customer类不用存放Or ...

  10. Hibernate基础学习(四)—对象-关系映射(上)

    一.映射对象标识符      Java语言按内存地址来识别或区分同一个类的不同对象,而关系数据库按主键值来识别或区分同一个表的不同记录.Hibernate使用对象标识符(OID)来建立内存中的对象和数 ...

随机推荐

  1. 自学Aruba2.3-Aruba Web UI --Configuration面板介绍

    点击返回:自学Aruba之路 自学Aruba2.3-Aruba Web UI --Configuration面板介绍 此文只展示重要面板,大部分通俗易懂就不过多语言介绍, 后期配置实例中再结合理论知识 ...

  2. Linux简介与安装

    Linux系统的组成 Linux 内核:内核是系统的"心脏",是运行程序与管理像磁盘和打印机等硬件设备的核心程序. Linux Shell:Shell是系统的用户界面,提供了用户与 ...

  3. socket模型处理多个客户端

    最近学完了简单的socket编程,发现其实socket的网络编程其实并没有什么难度,只是简单的函数调用,记住客户端与服务端的步骤,写起来基本没有什么问题. 在服务器程序的设计中,一个服务器不可能只相应 ...

  4. Android系统上如何实现easyconfig(airkiss)

    刚买回来一个智能音箱和博联,需要给音箱和博联配置联网,音箱需要先打开蓝牙,然后在手机app中填写wifi的ssid和密码,通过蓝牙发送到音箱,音箱收到后连接到wifi. 博联就比较奇怪,进入联网模式以 ...

  5. Js默认参数(多参数情况)

    js function example(settings) { var defaultSetting = { name: '小红', age: '30', sex: '女', phone: '1008 ...

  6. 开发高性能JAVA应用程序基础(集合篇)

    集合类在开发中使用非常频繁,使用时合理的选择对提高性能小有帮助.而且大部分面试都会有与集合相关的问题,例如ArrayList和LinkedList的对比. 了解API的集成与操作架构,才能了解何时该采 ...

  7. Java反射-高级知识掌握

    PS:本文就Java反射的高级知识做下汇总,理清在什么情况下,我们应该去使用反射,提供框架的健壮性,ps:xieyang@163.com/xieyang@163.com

  8. COGS 1299. bplusa【听说比a+b还要水的大水题???】

    1299. bplusa ☆   输入文件:bplusa.in   输出文件:bplusa.out   评测插件 时间限制:1 s   内存限制:128 MB [题目描述] 输入一个整数n,将其拆为两 ...

  9. BZOJ 1012: [JSOI2008]最大数maxnumber【线段树单点更新求最值,单调队列,多解】

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 10374  Solved: 4535[Subm ...

  10. Vijos P1113 不高兴的津津【模拟】

    不高兴的津津 描述 津津上初中了.妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班.另外每周妈妈还会送她去学习朗诵.舞蹈和钢琴.但是津津如果一天上课超过八个小时就会 ...