hibernate:hibernate初始化加载类

目录

一、SessionFactory 接口

1、初始化hibernate

2、获取SessionFactory实例

3、创建获取Session

4、关闭Session和SessionFactory

最终配置

二、Session 接口

1、get()方法和load()方法:

 2、查询

3、保存

 4、删除

 5、更新

6、一个完整的DAO接口实现类

三、Transaction事务管理

 具体代码结构

四、参考文章


一、SessionFactory 接口

SessionFactory是生成Session的工厂,构造 SessionFactory 很消耗资源,一般情况下一个应用中只初始化一个 SessionFactory 对象。

1、初始化hibernate

先声明SessionFactory:

private static SessionFactory sessionFactory;

hibernate4.3之前的初始化方式:

Configuration cfg = new Configuration().configure();
//读取配置文件
StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(cfg.getProperties()).build();
//创建服务注册对象
sessionFactory = cfg.buildSessionFactory(serviceRegistry);
//创建会话工厂对象SessionFactory

hibernate4.3之后的初始化方式:

ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure("/hibernate.cfg.xml").build();
//读取配置文件
sessionFactory = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory();
//创建会话工厂对象

2、获取SessionFactory实例

    // 获得SessionFactory的实例public static SessionFactory getsSessionFactory() {return sessionFactory;}

3、创建获取Session

   // 获得ThreadLocal对象管理的Sessionpublic static Session getSession() throws HibernateException {Session session = (Session) threadLocal.get();if (session == null || !session.isOpen()) {if (sessionFactory == null) {rebuildSessionFactory();}// 通过SessionFactory对象创建Session对象session = (sessionFactory != null) ? sessionFactory.openSession() : null;// 将Session对象保存到线程局部变量threadLocal中threadLocal.set(session);}return session;}

4、关闭Session和SessionFactory

     // 关闭Session实例public static void closeSession() {// 从线程局部变量threadLocal中获取之前存入的Session实例Session session = (Session) threadLocal.get();threadLocal.set(null);if (session != null) {session.close();}}  // 关闭缓存和连接池public static void shutdown() {getsSessionFactory().close();}

最终配置

package com.utils;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
public class LanUtils {private static SessionFactory sessionFactory;private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();// 创建线程局部变量threadLocal,用来保存Hibernate的Sessionstatic {   // 使用静态代码块初始化Hibernatetry {ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure("/hibernate.cfg.xml").build();//读取配置文件sessionFactory = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory();//创建会话工厂对象} catch (Throwable ex) {throw new ExceptionInInitializerError(ex);}}// 获得SessionFactory的实例public static SessionFactory getsSessionFactory() {return sessionFactory;}// 获得ThreadLocal对象管理的Sessionpublic static Session getSession() throws HibernateException {Session session = (Session) threadLocal.get();if (session == null || !session.isOpen()) {if (sessionFactory == null) {rebuildSessionFactory();}// 通过SessionFactory对象创建Session对象session = (sessionFactory != null) ? sessionFactory.openSession() : null;// 将Session对象保存到线程局部变量threadLocal中threadLocal.set(session);}return session;}// 关闭Session实例public static void closeSession() {// 从线程局部变量threadLocal中获取之前存入的Session实例Session session = (Session) threadLocal.get();threadLocal.set(null);if (session != null) {session.close();}}// 重建SessionFactorypublic static void rebuildSessionFactory() {Configuration configuration = new Configuration();  configuration.configure("/hibernate.cfg.xml");StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();sessionFactory = configuration.buildSessionFactory(serviceRegistry);}// 关闭缓存和连接池public static void shutdown() {getsSessionFactory().close();}
}

二、Session 接口

        Session 是应用程序与数据库之间交互操作的一个单线程对象,生命周期很短,是 Hibernate 运作的中心,所有持久化对象必须在 session 的管理下才可以进行持久化操作。

        Session 接口是 Hibernate 向应用程序提供的操作数据库的最主要的接口, 它提供了基本的保存, 更新, 删除和加载 Java 对象的方法。 

        Session可能处于以下三种状态:

        临时状态(transient): 不曾进行持久化,未与任何Session相关联,新建的对象。
        持久化状态(persistent): 仅与一个Session相关联,从数据库读数据。

        脱管状态(detached): 已经进行过持久化,但当前未与任何Session相关联,数据库内未读的数据。

1、get()方法和load()方法:

二者区别:      

        当数据库中不存在与OID对应的记录时,load()方法抛出ObjectNotFoundException异常,而get()方法返回为NULL。
        load方法采用配置的加载策略(默认为延迟加载),而get()方法则会忽略配置,总是采用立即加载方法。

        Session接口提供了4个重载的get方法和重载的load()方法,分别通过“持久类+主键”和“全类名+主键”以及“锁选项”来获取实体对象。

public Object get(Class clazz, Serializable id);
public Object get(Class clazz, Serializable id, LockOptions lockOptions);public Object get(String entityName, Serializable id);
public Object get(String entityName, Serializable id, LockOptions lockOptions);Object load(String entityName, Serializable id, LockOptions lockOptions);

 2、查询

Query createQuery(String hql)方法: 根据hql的查询语法查询表的内容,返回值为Query。

实例:

public List<User> findByHQL(String hql) {List<User> list = new ArrayList<>();Session session = HibernateUtil.getsSession();list = session.createQuery(hql).list();//list()方法:将上面方法返回的Query对象转换成List对象。session.close();return list;}

3、保存

         Session接口提供save()方法,将会将临时对象保存在Session缓存中,使其进入持久化,再选用映射文件指定的标识符生成器,为持久化对象分配唯一的ID,最后会计划执行一个insert语句将缓存内的对象存入数据库,其需要事务管理

实例:

    @Overridepublic void save(User user) {// 创建Session实例Session session = HibernateUtil.getsSession();// 创建Transaction实例相当于事务Transaction tx = session.beginTransaction();try {// 使用Session的save方法将持久化对象保存到数据库session.save(user);// 提交事务tx.commit();} catch (Exception e) {e.printStackTrace();// 出现异常,回滚事务tx.rollback();} finally {// 关闭Session连接HibernateUtil.closeSession();}}

 4、删除

        Session的delete()方法用于从数据库中删除一个java对象,其需要事务管理。delete()方法既可以删除持久化对象,也可以删除脱管对象。其处理过程如下:
        (1)如果传入的参数是脱管对象,则先使脱管对象与Session关联,使它变为持久化对象。如果参数是持久化对象,则忽略该步。
        (2)计划执行一个delete语句。
        (3)把对象从Session缓存中删除,该对象进入删除状态。

 实例:

     public void delete(User user) {Session session = HibernateUtil.getsSession();Transaction tx = session.beginTransaction();//事务开始try {session.delete(user);tx.commit();//提交事务} catch (Exception e) {e.printStackTrace();tx.rollback();//回滚} finally {HibernateUtil.closeSession();}}

 5、更新

        Session的update()方法使一个脱管对象转变为持久化对象,其需要事务管理。它完成以下操作:
        先将脱管对象加入到Session缓存中,使其转变为持久化对象,再计划执行一个update语句,将缓存内的对象与数据库同步。

实例: 

 @Overridepublic void update(User user) {Session session = HibernateUtil.getsSession();Transaction tx = session.beginTransaction();try {session.update(user);tx.commit();} catch (Exception e) {e.printStackTrace();tx.rollback();} finally {HibernateUtil.closeSession();}}
}

6、一个完整的DAO接口实现类

package org.hibernate.dao;import java.util.ArrayList;
import java.util.List;import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.entity.HibernateUtil;
import org.hibernate.entity.User;public class UserDAOImpl implements UserDAO {// 添加用户,需要事务管理@Overridepublic void save(User user) {// 创建Session实例Session session = HibernateUtil.getsSession();// 创建Transaction实例Transaction tx = session.beginTransaction();try {// 使用Session的save方法将持久化对象保存到数据库session.save(user);// 提交事务tx.commit();} catch (Exception e) {e.printStackTrace();// 出现异常,回滚事务tx.rollback();} finally {// 关闭Session连接HibernateUtil.closeSession();}}// 根据id查找用户 ,可以不需要事务管理 Get方式@Overridepublic User findByIdGet(int id) {User user = null;Session session = HibernateUtil.getsSession();// 使用session的get方法获取指定id的用户user = (User) session.get(User.class, id);if (user == null || "".equals(user)) {System.out.println("查询id为:" + id + "无结果....");}session.close();return user;}// 根据id查找用户 ,可以不需要事务管理 Load方式@Overridepublic User findByIdLoad(int id) {User user = null;Session session = HibernateUtil.getsSession();// 使用session的方法获取指定id的用户user = (User) session.load(User.class, id);if (user == null || "".equals(user)) {System.out.println("查询id为:" + id + "无结果....");}session.close();return user;}// 根据HQl语句查询@Overridepublic List<User> findByHQL(String hql) {List<User> list = new ArrayList<>();Session session = HibernateUtil.getsSession();list = session.createQuery(hql).list();session.close();return list;}// 删除用户 ,需要事务管理@Overridepublic void delete(User user) {Session session = HibernateUtil.getsSession();Transaction tx = session.beginTransaction();try {session.delete(user);tx.commit();} catch (Exception e) {e.printStackTrace();tx.rollback();} finally {HibernateUtil.closeSession();}}// 修改用户@Overridepublic void update(User user) {Session session = HibernateUtil.getsSession();Transaction tx = session.beginTransaction();try {session.update(user);tx.commit();} catch (Exception e) {e.printStackTrace();tx.rollback();} finally {HibernateUtil.closeSession();}}
}

三、Transaction事务管理

        Transaction对象用于管理对数据库的事务操作。通过Transaction对象,可以控制和管理一系列数据库操作,确保它们作为一个原子操作进行执行,以确保数据的一致性和完整性。

        其中插入(保存)、删除、更新操作需要事务进行管理。

 具体代码结构

// 获取当前线程绑定的Session
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
Transaction tx = session.beginTransaction();try {// 执行数据库操作(增删改查)// 提交事务tx.commit();
} catch (Exception e) {// 发生异常时回滚事务if (tx != null) {tx.rollback();}
} finally {// 关闭Sessionsession.close();
}

四、参考文章

Hibernate——配置并访问数据库 - 真的是从入门开始 - 博客园 (cnblogs.com)

hibernate中的session用法_list是hibernate中session的方法-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/860108.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

北邮《计算机网络》网络层笔记

文章目录 单词复习网络层前言路由算法&#xff08;构造路由表的算法&#xff09;静态路由算法自适应算法 拥塞控制QoS 服务质量&#xff08;小小的一节&#xff09;网络互联&#xff08;还是小小的一节&#xff09;Internet 单词复习 estimates boot off-line in advance refl…

【PyTorch单点知识】神经元网络模型剪枝prune模块介绍(上,非结构化剪枝)

文章目录 0. 前言1. 剪枝prune主要功能分类2. torch.nn.utils.prune中的方法介绍3. PyTorch实例3.1 BasePruningMethod3.2PruningContainer3.3 identity3.4random_unstructured3.5l1_unstructured 4. 总结 0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自己…

AI办公自动化:免费批量将英语电子书转成有声书

Edge-TTS是由微软推出的文本转语音Python库&#xff0c;通过微软Azure Cognitive Services转化文本为自然语音。可以作为付费文本转语音TTS服务的替代品&#xff0c;Edge-TTS支持40多种语言和300种声音&#xff0c;提供优质的语音输出 。 edge-tts支持英语、汉语、日语、韩语、…

基于Netron库的PyTorch 2.0模型可视化

【图书推荐】《从零开始大模型开发与微调&#xff1a;基于PyTorch与ChatGLM》_《从零开始大模型开发与微调:基于pytorch与chatglm》-CSDN博客 前面章节带领读者完成了基于PyTorch 2.0的MNIST模型的设计&#xff0c;并基于此完成了MNIST手写体数字的识别。此时可能有读者对我们…

C语言结构体包含结构体

C语言结构体可以包含另一个结构体&#xff1b; 下面通过一个例子看一下&#xff1b; struct Date {int day;int month;int year; };struct Person {char *name;struct Date birthday; }; ...... void CTestView::OnDraw(CDC* pDC) {CTestDoc* pDoc GetDocument();ASSERT_VAL…

备战秋招day3

碎碎念&#xff1a; 今天有个面试&#xff0c;学校这里还有实训。 今日任务&#xff1a;算法&#xff0b;mysql知识点补充 算法 24. 两两交换链表中的节点 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* List…

MySQL-索引:聚集索引、覆盖索引、组合索引、前缀索引、唯一索引

文章目录 MySQL-索引&#xff1a;聚集索引、覆盖索引、组合索引、唯一索引1、聚集索引2、覆盖索引3、组合索引4、唯一索引 MySQL-索引&#xff1a;聚集索引、覆盖索引、组合索引、唯一索引 1、聚集索引 在数据库中&#xff0c;聚集索引决定了表数据行的物理存储顺序。在InnoD…

C语言 | Leetcode C语言题解之第189题轮转数组

题目&#xff1a; 题解&#xff1a; void swap(int* a, int* b) {int t *a;*a *b, *b t; }void reverse(int* nums, int start, int end) {while (start < end) {swap(&nums[start], &nums[end]);start 1;end - 1;} }void rotate(int* nums, int numsSize, int…

国内邮件推送如何避免拦截?内容优化技巧?

国内邮件推送的平台怎么选择&#xff1f;如何提高邮件推送效果&#xff1f; 邮件营销是企业与客户沟通的重要方式&#xff0c;但在国内邮件推送过程中&#xff0c;邮件被拦截的问题屡见不鲜。为了确保邮件能够顺利送达目标用户&#xff0c;AokSend将探讨一些有效的策略&#x…

【Android】实现图片和视频混合轮播(无限循环、视频自动播放)

目录 前言一、实现效果二、具体实现1. 导入依赖2. 布局3. Banner基础配置4. Banner无限循环机制5. 轮播适配器6. 视频播放处理7. 完整源码 总结 前言 我们日常的需求基本上都是图片的轮播&#xff0c;而在一些特殊需求&#xff0c;例如用于展览的的数据大屏&#xff0c;又想展…

跟着DW学习大语言模型-什么是知识库,如何构建知识库

建立一个高效的知识库对于个人和组织来说非常重要。无论是为了个人学习和成长&#xff0c;还是为了组织的持续创新和发展&#xff0c;一个完善的知识管理系统都是不可或缺的。那么&#xff0c;如何建立一个高效的知识库呢&#xff1f; 在建立知识库之前&#xff0c;首先需要确定…

第3章 小功能大用处-事务与Lua

为了保证多条命令组合的原子性&#xff0c;Redis提供了简单的事务功能以及集成Lua脚本来解决这个问题。 首先简单介绍Redis中事务的使用方法以及它的局限性&#xff0c;之后重点介绍Lua语言的基本使用方法&#xff0c;以及如何将Redis和Lua脚本进行集成&#xff0c;最后给出Red…

项目实训-vue(十三)

项目实训-vue&#xff08;十三&#xff09; 文章目录 项目实训-vue&#xff08;十三&#xff09;1.概述2.处理按钮 1.概述 本篇博客将记录我在图片上传页面中的工作。 2.处理按钮 实现了图片的上传之后&#xff0c;还需要设置具体的上传按钮。 这段代码使用 Element UI 的 …

Linux之磁盘管理

最近工作中&#xff0c;进行需要进行项目部署、排查问题。而磁盘又是其中绕不开的一个环节。今天就来整理一下磁盘的操作。 1、查看磁盘使用情况 df -h文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 2.0G 0 2.0G 0% /dev tmpfs …

Spring学习02-[Spring容器核心技术IOC学习]

Spring容器核心技术IOC学习 什么是bean?如何配置bean?Component方式bean配合配置类的方式import导入方式 什么是bean? 被Spring管理的对象就是bean,和普通对象的区别就是里面bean对象里面的属性也被注入了。 如何配置bean? Component方式、bean配合配置类的方式、import…

C语言 | Leetcode C语言题解之第190题颠倒二进制位

题目&#xff1a; 题解&#xff1a; const uint32_t M1 0x55555555; // 01010101010101010101010101010101 const uint32_t M2 0x33333333; // 00110011001100110011001100110011 const uint32_t M4 0x0f0f0f0f; // 00001111000011110000111100001111 const uint32_t M8…

【containerd】Containerd高阶命令行工具nerdctl

前言 对于习惯了使用docker cli的用户来说&#xff0c;containerd的命令行工具ctr使用起来不是很顺手&#xff0c;此时别慌&#xff0c;还有另外一个命令行工具项目nerdctl可供我们选择。 nerdctl是一个与docker cli风格兼容的containerd的cli工具。 nerdctl已经作为子项目加入…

【区分vue2和vue3下的element UI Statistic 统计数值组件,分别详细介绍属性,事件,方法如何使用,并举例】

Element UI 是一个为 Vue.js 设计的 UI 组件库&#xff0c;但截至当前&#xff08;2023年&#xff09;&#xff0c;Element UI 主要针对 Vue 2.x 进行了设计和开发&#xff0c;并没有官方的 Vue 3.x 版本。然而&#xff0c;Vue 3.x 带来了许多新的特性和改进&#xff0c;因此一…

es 更新索引mapping和setting

1.关闭索引 curl -X POST "localhost:9200/your_index_name/_close"2.修改setting 配置 无法更新一些默认数据,按照需求构建&#xff0c;我这边是构建增加了分词器 "settings": {"index": {"creation_date": "1718850346547…

秋招突击——6/24——复习{完全背包问题——买书,状态转换机——股票买卖V}——新作{两数相除,LRU缓存实现}

文章目录 引言复习完全背包问题——买书个人实现 状态转换机——股票买卖V个人实现参考实现 新作两数相除个人实现 新作LRU缓存实现个人实现unordered_map相关priority_queue相关 参考实现自己复现 总结 引言 今天知道拼多多挂掉了&#xff0c;难受&#xff0c;那实习就是颗粒无…