hibernate_weixin_30802171的博客-程序员宅基地

技术标签: java  数据库  

1.

核心配置

<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
    <!--配置链接池-->
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="connection.url">jdbc:mysql://localhost:3306/station</property>
    <property name="connection.username">root</property>
    <property name="connection.password">admin</property>

    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    <!--展示sql语句-->
    <property name="show_sql">true</property>
    <property name="hbm2ddl.auto">update</property>
    <mapping resource="mapper/loginuser.hbm.xml"/>
</session-factory>
</hibernate-configuration>

 

2.建立映射文件

<?xml version="1.0" ?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hibernate.model">
<!--class表示一个由hibernate管理的持久对象,对应数据库的一个表-->
<!--LoginUser模型的名称-->
<!--table 数据库表名-->
<class name="LoginUser" table="login_user">
<!--id元素节点是必须的,是代表表的主键-->
<id name="id" column="id">
<!--generator表示主键生成的方式,多数是用native-->
<!--native自动选择数据库本地的策略-->
<!--mysql:AUTO_INTCREMENT自增-->
<!--oracle 序列-->
<generator class="native"/>
</id>
<!--非主键对象-->
<property name="userName" column="`username`"/>
<property name="passWord" column="`password`"/>
</class>
</hibernate-mapping>

 3.dao实现

public class LoginUserDao implements ILoginUserDao{
    

@Override
public void save(LoginUser loginUser) {
//读取并且解析配置文件
Configuration configuration = new Configuration();
//加载非默认配置文件 默认配置文件是hibernate.cfg.xml configuration.configure();
configuration.configure("hibernate.cfg.xml");
//生成会话工厂
SessionFactory sessionFactory = configuration.buildSessionFactory();
//获取对象
Session session = sessionFactory.openSession();
//开启事务管理
Transaction transaction = session.getTransaction();//必须写
transaction.begin();//必须写
// transaction.commit();
//操作CRUD
session.save(loginUser);
transaction.commit();//必须写 不然不报警且数据库没数据 但id被占用
session.close();
sessionFactory.close();

}
}

 4.

@Test
public void testsave(){
LoginUserDao loginUserDao = new LoginUserDao();
LoginUser loginUser = new LoginUser();
loginUser.setUserName("pioqkl");
loginUser.setPassWord("123456");
loginUserDao.save(loginUser);
}

 5.SessionFactory


主要作用:负责创建Session对象
概念:SessionFactory对象中保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句。同时,SessionFactory还负责维护Hibernate的二级缓存,查询缓存。

注意
1.SessionFactory对象的创建会有较大的开销,因为SessionFactory内部采取了线程安全的设计方式,因此在实际中SessionFactory对象可以尽量的共享,在大多数情况下,一个应用中针对一个数据库可以共享一个SessionFactory实例。
2.一个请求:一个Session对象(包含一个连接对象,一个事务对象,一个一级缓存)

重要的方法

openSession:这个方法代表,开启一个全新的Session

1)全新的连接
2)全新的事务
3)全新的一级缓存

getCurrentSession:得到当前上下文中的session
1)如果当前上下文中存在session,则使用该session;
2)如果当前上下文中不存在session,则使用opensession创建一个新的session;放到当前线程
3)要使用getCurrentSessoin,必须在hibernate.cfg.xml中配置thread
  <property name="current_session_context_class">thread</property>
4)getCurrentSession得到的session是和事务绑定的;
   无论是DML(数据操作语言)还是DQL(数据查询语言) ,都必须开启事务

   提交事务的时候就是关闭session

注意:getCurrentSession使用场景(如下)

本行转账业务:达到一致性,要不都成功,要不都失败保证在service层,在dao层获取的session都是同一个,对应就是同一个事务对象

 

列:

 

5.2org.hibernate.NonUniqueObjectException异常

 

下面这个是正确的

 

 

 

 结论: 先从一级缓存取,取不到,发出sql获取,放入一级缓存
// 一级缓存命中:只会发出一条sql
// 一级缓存命中条件:同一个session的OID是否相同
// 一级缓存内部的结构:
// OID:Object ID,hibernate里面定义
// 操作的持久对象全限定类名+"#"+数据库主键的值
// com.hibernate.day01.model.LoginUser#1
//存放在 Map<String,Object> cacheMap

 6.  状态的 理解

临时状态(transient):瞬时状态刚刚用new语句创建,没有和session发生关系没有被持久化,不处于session中。该对象成为临时对象
持久化状态(persistent):托管状态和session发生关系已经被持久化,加入到session的一级缓存中。该状态的对象为持久化对象。
游离状态(detached):脱管状态已经被持久化,但不处于session中。该状态的对象为游离对象。
删除状态(removed):从jpa出现,才有的状态只有调用了session.delete(domain对象)方法对象有关联的ID,并且在Session管理下,但是已经被计划删除(真正删除是提交事务的时候)

 7.脏数据更新

 

 8.      延迟加载(懒加载):

真正需要非主键属性,才发出sql,获取非主键属性值提高性能,但是如果把session提前关闭,会出现(延迟加载)延迟初始化异常

 

 

GET与load的区别

 

 

 

 9.状态转变原理图

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/huanglp/p/8514587.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30802171/article/details/98352023

智能推荐

pacs通讯测试软件,全院级PACS系统模拟测试报告_我变成了一条狗的博客-程序员宅基地

放射科、超声检查中心、内镜中心、泌尿外科各科室设备:放射科: CR/DR预约工作站1台CR诊断工作站1台DR诊断工作站1台CT预约工作站1台CT诊断工作站1台模拟设备CR/DR超声检查中心:黑白超声 1台内镜中心: 内镜 1台泌尿外科: 碎石机 1台服务器: 1台采集卡三张,CCD三...

springBoot中使用rabbitMQ以及消息丢失问题_西楚子羽的博客-程序员宅基地

创建springBoot项目教程略过。1.先导入maven依赖&lt;!--amqp 依赖包--&gt;&lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-amqp&lt;/artifactId&gt;&lt;/dependency&gt;yml文件配置server: port: 7002spring:

iOS精确计算label 的高度_ios根据label内容计算高度_翻滚的code的博客-程序员宅基地

CGFloat width = self.view.frame.size.width - 40; NSString * string = @"还记得你说家是唯一的城堡随着稻香河流继续奔跑微微笑 小时候的梦我知道不要哭让萤火虫带著你逃跑乡间的歌谣永远的依靠回家吧 回到最初的sdvsldfjnwefqej;wlednef,sbf.s,bfbkj.fejwfwfkjwjkfwefbwejfbw

【解析】心田上的百合花开——心田花开_百合花课文在表达主题和写作技巧上的表现_小fafa.的博客-程序员宅基地

在各行竞争如此激烈的今天,语文成绩的比拼也不甘落后,想要提高语文成绩,上课认真听讲,学“透”每篇文章还不够!仅仅是课本的知识是远远不够的,对于课外知识的拓展延伸也不能落下,心田花开认为多阅读课外的散文集利于提升基础文学知识,以课本内容结合延伸知识的学习方式去有效提升语文成绩。《心田上的百合花开》是一篇非常值得阅读的文章,是中国当代散文八大家之一的林清玄所著,该文章被上海教育出版社、山东出版社纳...

MSM8940 Camera 架构以及移植手册 ---super Good_高通msm8940_zmjames2000的博客-程序员宅基地

come from :http://blog.chinaunix.net/uid-7213935-id-5753785.html上篇:camera系统架构 3一.Camera硬件系统 31. 硬件要点 32. 硬件接口 33. 主要参数性能比较 3二.Camera 软件系统 41. Camera Daemon 进程 52. Camera frontend 63. Hal 层和mm...

laravel 批量更新数据_ykppky的博客-程序员宅基地

方法:默认用$multipleData数组中的第一个key作为主键更新public function updateBatch($tableName,$multipleData = []) { try { if (empty($multipleData)) { throw new \Exception("数据不...

随便推点

Solaris10 X86下安装Oracle 10gR2_congditong6927的博客-程序员宅基地

1. 安装Solaris10我的硬件选择的是30G空间,1G内存,2核(台式机是4核,闲着那么多核也没啥用)这个步骤最简单,从SUN网站上下载后直接在VM里面设置为ISO启动就行了,其他的基本一路NEXT而已。(注意下硬...

CTF论剑场web题目(持续更新)--WEB14_拼音怪兽的博客-程序员宅基地

web14打开页面查看源码:告诉我们“这是一个假的403,你应该善于发现“,其实这并没有什么用,嘿嘿,题目告诉我们“听说备份了不少东西呢”,所以我想到了备份文件泄露,先用工具扫一下:发现了这个,典型的.git备份文件泄露,所以咱们直接上工具Githack链接在这:https://github.com/lijiejie/GitHack扫描完成后出现了这两个文件:查看flag.php,flag就在里面。注:萌新第一次写write up,不足之处还请见谅,不对之处欢迎批评指正。...

从CRP(关键渲染路径)优化中谈浏览器渲染原理_莫纷飞的博客-程序员宅基地

浏览器从收到 HTML、CSS 和 JavaScript 字节到对其进行必需的处理,从而将它们转变成渲染的像素这一过程中有一些中间步骤,这些必要的步骤,就是CRP浏览器完成的步骤:处理 HTML 标记并构建 DOM 树。处理 CSS 标记并构建 CSSOM 树。将 DOM 与 CSSOM 合并成一个渲染树。根据渲染树来布局,以计算每个节点的几何信息。将各个节点绘制到屏幕上。

vue @click 绑定的函数,传入事件对象和自定义参数_々仄言的博客-程序员宅基地

1.仅传入自定义参数html:&lt;div id="app"&gt; &lt;button @click="tm(123)"&gt;ddddd&lt;/button&gt;&lt;/div&gt;js:new Vue({ el:'#app', methods:{ tm:function(e){ console.log(e); //会输出 123 } }})2.仅传入事件对象html:&lt;div id="app

用python画分析曲线图_python画曲线图代码_OuYangchangjie的博客-程序员宅基地

#导入matplotlib包import matplotlib.pyplot as pltimport matplotlib as mplmpl.rcParams['font.sans-serif']=['SimHei']#设中文编码#准备数据#汇率eurcny =[6.3432,6.5343,6.4342,6.0897,6.7644,6.5445,6.0987,6.8076,6.9808,6.7805,6.1054,6.4343,6.5423,6.4342,6.0098,6.4341,6.

实机桌面上给虚拟机安装系统(分区,恢复GHO)_weixin_34404393的博客-程序员宅基地

在虚拟机里安装系统大家都会了。我这里介绍一种方法无须进入虚拟机里操作。全部在实机里完成对虚拟机安装系统(分区。恢复GHO).这里要使用到的工具如下1分区工具DISKGENIUS2虚拟光驱3Ghost镜像浏览器一  给虚拟机分区,分区方法参考本人以前做的一个教程http://bbs.kafan.cn/thread-689261-1-1.html二 使用虚拟光驱加载ISO镜像(这个相信大家都会,...

推荐文章

热门文章

相关标签