热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

Hibernate核心API

五、核心APIConfigurationA)AnnotationConfigurationB)进行配置信息的管理C)用来产生SessionFactoryD)可以在configure方法中指定hibernate配置文件E)只需要关注一个方法:buildSessionFactory()1、configure()方法【本文来自鸿网互联(ww

五、核心API Configuration A) AnnotationConfiguration B) 进行配置信息的管理 C) 用来产生SessionFactory D) 可以在configure方法中指定hibernate配置文件 E) 只需要关注一个方法:buildSessionFactory() 1、configure()方法【本文来自鸿网互联 (http://ww

五、核心API

Configuration

A) AnnotationConfiguration

B) 进行配置信息的管理

C) 用来产生SessionFactory

D) 可以在configure方法中指定hibernate配置文件

E) 只需要关注一个方法:buildSessionFactory()

1、configure()方法【本文来自鸿网互联 (http://www.68idc.cn)】有一个重载的方法configure(String str),用于指定配置文件的路径。

2、SessionFactory可以用于产生session,如调用其getCurrentSession()方法

3、SessionFactory需要注意2个方法:openSession()和getCurrentSession()

openSession()永远是用于打开新的session,getCurrentSession()是如果当前环境有sesion,则使用当前上下文的session,如果没有,则会打开新的session,但是session一旦提交,再次拿的就是,就是新的session。openSession()需要手动close,getOpenSession()是在事务提交的时候,自动close.

所谓上下文的session,是在hibernate.cfg.xml中,配置的thread。其取值有如下:jta|thread|managed|custom.Class

getCurrentSession()的作用:界定事务边界

Hibernate中对象的3种状态:Transient,Persistence,Detached

三种状态的关键区分:

A.有没有ID

B.ID在数据库中有没有

C.在内存中有没有

三种状态:

A、Trainsient:内存中一个对象,没有ID,缓存中没有

B、Persistent:内存中有,缓存中有,数据库中有(ID)

C、Detached:内存有,缓存没有,数据库有

Session:

管理一个数据库的任务单元。主要方法有:

1)save()

save()方法执行前,对象是Transient状态,save()方法执行后,对象变为Persistent状态,Session对象执行完commit()方法之后,对象变为Detached状态。

2)delete()

delete()方法可以删除Persistent状态和Detached状态的对象,不能删除Transient

3)Update

A)用来更新detached状态对象,更新完成后转为persistent状态对象

B)更新transient状态对象会报错

C)更新自己设定id的transient状态对象不会出错(数据库中必须先有对应的记录)

D)更新部分更改的字段(当更新persistent状态的对象时,会发现sql语句中,更新了所有的字段,如果只想更新做了修改的字段,可以使用如下方式)

a)在对应的get()方法上加@Column(updatable=false)或者在xml文件标签中增加update=”false”

b)在xml中,在标签中增加如下dynamic-update="true"

c)跨session时想要实现部分字段更新,,可以使用Session的merge()方法

d)使用HQL(EJBQL)语句

4)saveOrUpdate()

根据具体情况使用save()或者update()方法

5)load()

6)get()

7)get()和load()的区别

两者都可以将一条数据从数据库中读出来,转化成一个对象。

两者的区别在于:

A)load()方法返回的是代理对象,等到真正用到对象的内容时才才发出sql语句

B)get()方法直接从数据库中加载,不会存在延迟。

C)不存在对应记录的时候,两者表现不同。原因:两者一个会发出sql语句,一个不会发出sql语句。

8)clear()

无论是get()或load()方法,都会首先查找缓存(一级缓存),如果没有,才会去数据库中查找,如果已经存在,则不会去数据库中查找clear()方法可以强制清除session缓存

9)flush()

强制让缓存中的数据和数据库中的数据做同步

小实验:

package com.zgy.hibernate.model;







import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.cfg.AnnotationConfiguration;

import org.hibernate.tool.hbm2ddl.SchemaExport;



import org.junit.AfterClass;

import org.junit.BeforeClass;

import org.junit.Test;



public class HibernateCoreAPITest {



public static SessionFactory sf = null;

@BeforeClass

public static void beforeClass(){

sf = new AnnotationConfiguration().configure().buildSessionFactory();

}

@Test

public void testSave() {

//teacher是Transient状态

Teacher teacher = new Teacher();

teacher.setName("张三");

teacher.setAddress("北京");



Session session = sf.getCurrentSession();

session.beginTransaction();



//teacher是Persistent状态

session.save(teacher);



//teacher是Detached状态

session.getTransaction().commit();



}

/*



@Test

public void testDelete() {

//teacher是Transient状态

Teacher teacher = new Teacher();

teacher.setName("李四");



Session session = sf.getCurrentSession();

session.beginTransaction();

//这里进行删除,是删除不掉的,因为此时对象没有ID



session.save(teacher);

//执行完save()方法后,teacher是Persistent状态,这时可以删除对象





session.getTransaction().commit();

//执行完commit()后,teacher是Detached状态,这里删除teacher对象也是可以的

Session session2 = sf.getCurrentSession();

session2.beginTransaction();

session2.delete(teacher);

session2.getTransaction().commit();



}

*/

@Test

public void testLoad() {

Session session = sf.getCurrentSession();

session.beginTransaction();

Teacher t = (Teacher)session.load(Teacher.class, 1);

System.out.println(t.getClass());

session.getTransaction().commit();

//System.out.println(t.getName());

}



@Test

public void testGet() {

Session session = sf.getCurrentSession();

session.beginTransaction();

Teacher t = (Teacher)session.get(Teacher.class, 1);

System.out.println(t.getClass());

session.getTransaction().commit();

//System.out.println(t.getName());

}



@Test

public void testUpdate1() {

Session session = sf.getCurrentSession();

session.beginTransaction();

Teacher t = (Teacher)session.get(Teacher.class, 1);

session.getTransaction().commit();



t.setName("张小三");



Session session2 = sf.getCurrentSession();

session2.beginTransaction();

session2.update(t);

session2.getTransaction().commit();

}



@Test

public void testUpdate2() {

Teacher t = new Teacher();

t.setName("张小三");

t.setId(1);

Session session2 = sf.getCurrentSession();

session2.beginTransaction();

session2.update(t);

session2.getTransaction().commit();

}



@Test

public void testUpdate3() {



Session session = sf.getCurrentSession();

session.beginTransaction();

Teacher t = (Teacher)session.get(Teacher.class, 1);

t.setName("张三三");

session.getTransaction().commit();

}



@Test

public void testSaveOrUppdate() {

Teacher t = new Teacher();

t.setName("李四");

t.setAddress("天津");

Session session = sf.getCurrentSession();

session.beginTransaction();

session.saveOrUpdate(t);

session.getTransaction().commit();



t.setName("李四四");

Session session2 = sf.getCurrentSession();

session2.beginTransaction();

session2.saveOrUpdate(t);

session2.getTransaction().commit();



}





@Test

public void testClear() {

Session session = sf.getCurrentSession();

session.beginTransaction();

Teacher t = (Teacher)session.load(Teacher.class, 1);

System.out.println(t.getName());

//使用clear()方法清楚缓存

session.clear();



Teacher t2 = (Teacher)session.load(Teacher.class, 1);

System.out.println(t2.getName());

session.getTransaction().commit();

System.out.println(t.getName());

}



@Test

public void testFlush() {

Session session = sf.getCurrentSession();

session.beginTransaction();

Teacher t = (Teacher)session.load(Teacher.class, 1);

t.setName("ttt");

//加入flush()方法后,会导致两次update操作,如果不加入,则在下面的场景下,只会有一次update

session.flush();

t.setName("ttttt");

session.getTransaction().commit();

}



@AfterClass

public static void afterClass(){

sf.close();

}

}


推荐阅读
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 推荐一个ASP的内容管理框架(ASP Nuke)的优势和适用场景
    本文推荐了一个ASP的内容管理框架ASP Nuke,并介绍了其主要功能和特点。ASP Nuke支持文章新闻管理、投票、论坛等主要内容,并可以自定义模块。最新版本为0.8,虽然目前仍处于Alpha状态,但作者表示会继续更新完善。文章还分析了使用ASP的原因,包括ASP相对较小、易于部署和较简单等优势,适用于建立门户、网站的组织和小公司等场景。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何在MySQL中将零值替换为先前的非零值的方法,包括使用内联查询和更新查询。同时还提供了选择正确值的方法。 ... [详细]
  • 本文介绍了如何使用Power Design(PD)和SQL Server进行数据库反向工程的方法。通过创建数据源、选择要反向工程的数据表,PD可以生成物理模型,进而生成所需的概念模型。该方法适用于SQL Server数据库,对于其他数据库是否适用尚不确定。详细步骤和操作说明可参考本文内容。 ... [详细]
  • 在数据分析工作中,我们通常会遇到这样的问题,一个业务部门由若干业务组构成,需要筛选出每个业务组里业绩前N名的业务员。这其实是一个分组排序的 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 本文介绍了adg架构设置在企业数据治理中的应用。随着信息技术的发展,企业IT系统的快速发展使得数据成为企业业务增长的新动力,但同时也带来了数据冗余、数据难发现、效率低下、资源消耗等问题。本文讨论了企业面临的几类尖锐问题,并提出了解决方案,包括确保库表结构与系统测试版本一致、避免数据冗余、快速定位问题等。此外,本文还探讨了adg架构在大版本升级、上云服务和微服务治理方面的应用。通过本文的介绍,读者可以了解到adg架构设置的重要性及其在企业数据治理中的应用。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
author-avatar
手机用户2502878261
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有