五、核心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中,配置的
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文件
b)在xml中,在
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(); } }

如今,大多数Windows用户都使用虚拟机。当他们系统上的核心隔离被禁用时,安全风险和攻击是可以预料的。即使设置了核心隔离,如果用户升级了系统,也会禁用内存完整性。如果启用核心隔离,系统将免受攻击。对于经常使用虚拟计算机的人,强烈建议他们启用它。如果您正在寻求有关如何在任何Windows11系统上启用或禁用核心隔离内存完整性的说明,此页面可以提供帮助。如何使用Windows安全应用在Windows11中启用或禁用核心隔离内存完整性第1步:按Windows键并键入Windows安全

提到API开发,你可能会想到DjangoRESTFramework,Flask,FastAPI,没错,它们完全可以用来编写API,不过,今天分享的这个框架可以让你更快把现有的函数转化为API,它就是Sanic。Sanic简介Sanic[1],是Python3.7+Web服务器和Web框架,旨在提高性能。它允许使用Python3.5中添加的async/await语法,这可以有效避免阻塞从而达到提升响应速度的目的。Sanic致力于提供一种简单且快速,集创建和启动于一体的方法

机器人也能干咖啡师的活了!比如让它把奶泡和咖啡搅拌均匀,效果是这样的:然后上点难度,做杯拿铁,再用搅拌棒做个图案,也是轻松拿下:这些是在已被ICLR 2023接收为Spotlight的一项研究基础上做到的,他们推出了提出流体操控新基准FluidLab以及多材料可微物理引擎FluidEngine。研究团队成员分别来自CMU、达特茅斯学院、哥伦比亚大学、MIT、MIT-IBM Watson AI Lab、马萨诸塞大学阿默斯特分校。在FluidLab的加持下,未来机器人处理更多复杂场景下的流体工作也都

在SpringBoot项目中集成Hibernate前言Hibernate是一个流行的ORM(对象关系映射)框架,它可以将Java对象映射到数据库表,从而方便地进行持久化操作。在SpringBoot项目中,集成Hibernate可以帮助我们更轻松地进行数据库操作,本文将介绍如何在SpringBoot项目中集成Hibernate,并提供相应的示例。1.引入依赖在pom.xml文件中引入以下依赖:org.springframework.bootspring-boot-starter-data-jpam

本篇文章给大家带来了关于API的相关知识,其中主要介绍了设计API需要注意哪些地方?怎么设计一个优雅的API接口,感兴趣的朋友,下面一起来看一下吧,希望对大家有帮助。

当您的WindowsPC出现网络问题时,问题出在哪里并不总是很明显。很容易想象您的ISP有问题。然而,Windows笔记本电脑上的网络并不总是顺畅的,Windows11中的许多东西可能会突然导致Wi-Fi网络中断。随机消失的Wi-Fi网络是Windows笔记本电脑上报告最多的问题之一。网络问题的原因各不相同,也可能因Microsoft的驱动程序或Windows而发生。Windows是大多数情况下的问题,建议使用内置的网络故障排除程序。在Windows11

这款芯片可能会搭载高达80个GPU核心,进而成为M3系列中性能最强大的产品。Max两倍核心数量从M1与M2系列的发展模式来看,苹果的「Ultra」版芯片基本上是「Max」版本的两倍核心数量,这是因为苹果实际上将两颗Max芯片透过内部连接技术结合起来,形成了M1Ultra与M2Ultra。80个GPU核心M3Ultra可能拥有「高达80个图形处理核心」。这一预测基于苹果芯片的发展路径:从基础版到「Pro」版,再到图形核心数量翻倍的「Max」版,以及CPU和GPU核心都翻倍的「Ultra」版。举例来

Java是一种面向对象编程语言,它被广泛地应用于软件开发领域。Hibernate是一种流行的Java持久化框架,它提供了一种简单且高效的方式来管理Java对象的持久化。然而,开发过程中经常会遇到Hibernate错误,这些错误可能会导致程序的异常终止或者不稳定。如何处理和避免Hibernate错误成为了Java开发者必须掌握的能力。本文将介绍一些常见的Hib


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.
