hiberante学习笔记
1、配置文件(hibernate映射文件):
让hibernate知道该怎么样去load,store持久化对象;
1.1 数据库忌讳的字段名
1) User
2) index
2、数据库表中一对多,多对一的关系解释:
一个省份本身就有一个表。一个城市本身也是一个表。
一个省份拥有多个城市,也就是说一个省份要对应多张城市表;
由此可见省份和城市的关系是:多对 一;
同理可以推出:城市和市民的关系是 一 对 多;
3在数据库中:
省份往往以ID的形式放在城市中作为索引;也就是说 往往只有多对一;
4、SessionFactory和 Configuration都是静态的,线程安全的对象;
而Session不是线程安全对象,所以一般情况下只能有一个Session;
Threadlocal.set(session):在ThreadLocal中创建一个Session对象变量副本
5、Transaction:
是数据库一个操作单元,具有4个特性:
1、原子性:同一个单元操作,要么全部录入,要么全部不要录入;
2、一致性:保证从一个一致状态迁移到另一个一致状态与原子性相关。
3、隔离性:多个并发事务之间不能相互干扰并发不影响事务的执行
4、持久性:一旦事务成功完成(Commit),它对数据库的更新应该是持久即使在写入磁盘之前,系统发生故障在下次启动之后,也应保障数据更新的有效
6、在配置中
〈property name = “propertyName”〉
name指的是实体类中的属性propertyName,如果没有指定此属性在数据库 中列的名字和数据类型,那就按照缺省模式;(即按照实体类属性来定义)。
<property name = “propertyName type = “string”>
这里的type指的是hibernate锁定的属性;
8、set的应用:
例如人与活动的关系:人和活动是多对多的关系;
那么可以先看一边:在人的表结构中创建一个set集合(用于存放活动)。
9、持久化类:
只有一些属性和简单的getter、setter方法的简单javabean类;
10、一个session代表一个单线程单元操作;
一般这个session单元操作会被绑定到应用程序的java线程,当session被用完之后,hibernate会让session从当前应用程序java线程脱离,并关闭;当你从调用getSessio():你会得到新的Session
11、在加载了持久化类之后:
使用普通的集合方法就可以很容易地修改我们定义的集合。Hibernate就会自动检测到集合已经被修改并需要更新回数据库。(自动脏检查)。
12、Session.load(class,serializable); 加载出来的持久化对象是指数据库里的表,是一个空的实例化对象?
加载出来的对象是根据serializable条件加载出来的持久化对象,并且他并非一个空对象,而是一个加载了数据库里一条记录的持久化对象;
13、Java对象在JVM中的生命周期:
创建一个Java对象时,JVM会为这个对象分配一个内存空间,只要这个对象被引用变量引用,就一直存在于内存中,如果一个对象不被任何引用变量引用,就结束生命周期。Java集合(List、Map、Set)存放的是Java对象的引用,当向集合中添加一个对象时,其实是把这个对象的引用添加到集合中。因此集合中含有的对象生命周期一直存在。
14、理解Session的缓存:
在Session接口的实现中定义一系列的Java集合,这些集合构成了Session的缓存。
Session缓存的作用:
1、减少访问数据库的频率,可以提高数据库访问的性能。
2、保证缓存中的对象与数据库中的相关记录保持同步。
3、当缓存中的持久化对象(位于缓存中的对象)之间存在循环关联关系时,Sessioin会保证不出现访问对象的死循环。
14、持久化对象的3个状态:
14.1、 瞬时(transient)状态:
该实例是刚用new语句创建的,还没有被持久化,不处于任何Session的缓存中。它没有持久化标识(相当于主键值)。处于瞬时状态的实例被称为瞬时对象。它的特点是:
不和任何一个Session实例关联。在数据库中没有对应的记录。
没有持久化标识(即没有主键值)
14.2 持久化(persistent)状态:
已经被持久化,加入到Session缓存中。处于持久化状态的实例被称为持久化对象。
实例目前与某个Session有关联。 它拥有持久化标识(相当于主键值),并且可能在数据库中有一个对应的行。 Hibernate保证在同一个Sesion实例的缓存中,数据库中的每条记录只对应唯一的持久化对象。 它的特点是:
持久化对象总是被一个Session实例关联。持久化对象和数据库中的相关记录对应。Session在清理缓存时,会根据持久化对象的属性变化,来同步更新数据库
有持久化标识(即有主键值)
。
14.3、 脱管(detached)状态:
已经被持久化过,但不再处于Session的缓存中。处于脱管状态的实例被称为脱管对象。实例曾经与某个持久化上下文发生过关联,不过那个上下文(session)被关闭了, 或者这个实例是被序列化(serialize)到另外的进程。 它拥有持久化标识,并且在数据库中可能存在一个对应的行。 对于脱管状态的实例,Hibernate不保证任何持久化标识和Java标识的关系。它的特点是:
不再位于session的缓存中,即它不再和session关联。它拥有持久化标识(即没有主键值)
14.4、Session的操作图:
15.1、数据库中是不讲究大小写的;
15.2、不能把表明随便定义为user;
17.hibernate查询
17.1sql与hql的根本分别
17.1.Hql 以对象为单位,
17.2.sql以数据库字段为单位
17.2外键为空引发的问题
使用select查询的hql和sql语句查询中,若查询字段中出现外键并且此时外键值为空时,会出现结果集也为空的情况;
/*String sql = DAOUtil.generateSql("Goods", condition);*/
/*String sql = "select g.goods_Id,g.goods_No,g.goods_Name,g.goods_Image,g.market_Price," +
"g.VIP_Price,g.discount,g.isVisible,g.stock,g.goods_CateChild.goods_CateChild_Id," +
"g.goods_CateChild.goods_CateChild_Name,g.activityGoodsType.activityGoodsType_Id," +
"g.activityGoodsType.activityGoodsType_Name from Goods g";*/
/*String sql = "select g.goods_Id,g.goods_Name,g.goods_CateChild.goods_CateChild_Name," +
"g.goods_CateChild.goods_CateChild_Id,g.activityGoodsType.activityGoodsType_Id, " +
"g.stop_date from Goods g";*/
/*String sql = "select * from DBQihang.dbo.Goods";*/
/*String sql = "from Goods";*/
/*String sql = "select g.goods_Id,g.goods_No,g.goods_Name,g.goods_Image,g.market_Price," +
"g.VIP_Price,g.discount,g.isVisible,g.stock,gt.goods_CateChild_Id,gt.goods_CateChild_Id," +
"gc.activityGoodsType_Id,gc.activityGoodsType_Name from DBQihang.dbo.Goods g," +
"DBQihang.dbo.Goods_CateChild gt,DBQihang.dbo.ActivityGoodsType gc " +
" where gt.goods_CateChild_Id=g.goods_CateChild_Id and gc.activityGoodsType_Id=g.activityGoodsType_Id" +
" order by goods_Id";*/
//由于外键为空导致的问题
/* String sql = "select g.activityGoodsType.activityGoodsType_Id,g.activityGoodsType.activityGoodsType_Name" +
" from Goods g";*/
17.3外键lazy怎么办?
使用hibernate之初我也非常地疑惑,如果把外键设置为lazy,那么我还能不能拿到外键的id呢,经过验证,是可以的。
事实上,你可以把lazy当成懒惰,就是当你不向它要的时候我就不查,当你查完之后还要这个数据时,他会自己查给你,不需要 你自己去手动查找。
17.4外键为null怎么办?
外键为null,会给你的查询带来诸多不便。在设计的时候必须考虑并事先做好处理报错的一些动作。
例如if(list.get(0).getGoods_CateChild() != null){
System.out.println(list.get(0).getGoods_CateChild().getGoods_CateChild_Id());
}
17.5select * 或者 from
前者是sql,或者hql,他们都可以查到这个表里所有的数据。无须再怀疑。
17.6 sql查询
使用sql查询,需要注意两个点
- 确定dababase与schema,表名(Goods),查询时需要写成DBName.dbo.Goods
- 面向表,与字段,而不是对象;
hiberante学习笔记的更多相关文章
- [原创]java WEB学习笔记98:Spring学习---Spring Bean配置及相关细节:如何在配置bean,Spring容器(BeanFactory,ApplicationContext),如何获取bean,属性赋值(属性注入,构造器注入),配置bean细节(字面值,包含特殊字符,引用bean,null值,集合属性list map propert),util 和p 命名空间
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点,在hibernate 中 java类型 与sql类型之间的对应关系,Java 时间和日期类型的映射,Java 大对象类型 的 映射 (了解),映射组成关系
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记77:Hibernate学习之路---Hibernate 版本 helloword 与 解析,.环境搭建,hibernate.cfg.xml文件及参数说明,持久化类,对象-关系映射文件.hbm.xml,Hibernate API (Configuration 类,SessionFactory 接口,Session 接口,Transaction(事务))
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Hibernate 马士兵 学习笔记 (转)
目录(?)[+] 第2课 Hibernate UML图 第3课 风格 第4课 资源 第5课 环境准备 第6课 第一个示例Hibernate HelloWorld 第7课 建立Annotation版本的 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
随机推荐
- phpcms响应式布局导航条
- Apache 使用localhost(127.0.0.1)可以访问 但是使用本机IP(局域网)不能访问
- 使用ThreadLocal、Apache的dbutils的QueryRunner和dbcp2数据库连接池的BasicDataSource封装操作数据库工具
package hjp.smart4j.framework.helper; import hjp.smart4j.framework.util.CollectionUtil; import hjp.s ...
- Java——新IO 缓冲区与Buffer
缓冲区和Buffer import java.nio.IntBuffer; //================================================= // File Na ...
- JavaWeb学习笔记——开发动态WEB资源(三)显示当前时间
该工程的功能是实现在页面中显示当前的时间 以下的代码是HelloServlet.java中的代码 package helloapp2; import java.io.IOException; impo ...
- NGINX 配置404错误页面转向
什么是404页面 如果碰巧网站出了问题,或者用户试图访问一个并不存在的页面时,此时服务器会返回代码为404的错误信息,此时对应页面就是404页面.404页面的默认内容和具体的服务器有关.如果后台用的是 ...
- C++11
http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list http://www.open-std.o ...
- ecshop商品-》购买记录
注意事项:{insert name='bought_notes' id=$id} 有了产品ID一切都好说 html代码 <!-- #BeginLibraryItem "/libra ...
- json_encode
html文件 <html> <title>php+jquery+ajax+json简单小例子</title> <?php header("Conte ...
- C#:String.Format数字格式化输出
int a = 12345678; //格式为sring输出// Label1.Text = string.Format("asdfadsf{0}adsfasdf",a);// ...