Rhythmk 学习 Hibernate 03 - Hibernate 之 延时加载 以及 ID 生成策略
Hibernate 加载数据 有get,跟Load
1、懒加载:
使用session.load(type,id)获取对象,并不读取数据库,只有在使用返回对象值才正真去查询数据库。
@Testpublic void test1(){Session session = null;try {session = HibernateUtil.getSessionFactory().openSession();User user=(User)session.load(User.class, 130);user.getUserId();// 懒加载此时并不查询数据库System.out.println("开始读取数据库...");user.getName();} catch (Exception e) {e.printStackTrace();} finally {if (session != null)session.close();}}
1.1、 当调用load方法时候,如果数据库不存在对应数据则抛出异常:
输出:
开始读取数据库...
Hibernate: select user0_.userId as userId1_0_0_, user0_.openId as openId2_0_0_, user0_.type as type3_0_0_, user0_.name as name4_0_0_, user0_.createTime as createTi5_0_0_ from user user0_ where user0_.userId=?
org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.rhythmk.model.User#130]
at org.hibernate.internal.SessionFactoryImpl$1$1.handleEntityNotFound(SessionFactoryImpl.java:253)
at org.hibernate.proxy.AbstractLazyInitializer.checkTargetState(AbstractLazyInitializer.java:262)
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:176)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:286)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185)
at com.rhythmk.model.User_$$_jvst247_0.getName(User_$$_jvst247_0.java)
....
1.2 、当调用load 方法时候 如果数据库存在此对象,执行上面代码user.getUserId()并非直接从数据库中读取,只有在使用非主键属性才读取数据库 ,从上面程序输出即可看出此特征。
1.3、 当调用延时加载返回的对象,因session回话已经关闭 ,此时则抛出异常:
@Testpublic void test2(){User user=getUser(13);try {user.getName();} catch (Exception e) {e.printStackTrace();}}public static User getUser(Integer id) {Session session = null;User user = null;try {session = HibernateUtil.getSessionFactory().openSession();user = (User) session.load(User.class, id);} catch (Exception e) {e.printStackTrace();} finally {if (session != null)session.close();}return user;}
输出:
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:165)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:286)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185)
at com.rhythmk.model.User_$$_jvstc5f_0.getName(User_$$_jvstc5f_0.java)
2、Get获取数据
调用get方法直接读取数据库:
@Testpublic void test3(){Session session = null;try {session = HibernateUtil.getSessionFactory().openSession();User user=(User)session.get(User.class, 13);System.out.println("开始读取数据库...");user.getUserId();// 懒加载此时并不查询数据库user.getName();} catch (Exception e) {e.printStackTrace();} finally {if (session != null)session.close();}}
输出:
Hibernate: select user0_.userId as userId1_0_0_, user0_.openId as openId2_0_0_, user0_.type as type3_0_0_, user0_.name as name4_0_0_, user0_.createTime as createTi5_0_0_ from user user0_ where user0_.userId=?
开始读取数据库...
---------------- ID 生成策略-------------
参考表映射XML配置如下:
<id name="实体类属性名" type="java.lang.Integer">
<column name="对应表中主键字段名" />
<generator class="assiged|increment|identity|native|........" />
</id>
1:assigned
----表示在新增数据时由应用程序指定主键的值。主要针对主键是采用自然主键的形式。这种方式,适用于主键列不是自动增长列。
其缺点为在执行新增操作时,需查询数据库判断生成的主键是否已经存在。
2:increment
----表示新增数据操作时由hibernate自动生成主键值。其生成的值为:先查询该主键列的最大值,然后在最大值的基础上加上1.适用于采用代理主键形式的主键列。同样不能用于主键列是自动增长的表。但是,该主键生成策略也有些缺点。
(1)新增数据前先查询一遍,影响了性能。
(2)主键的类型只能为数值型的int或者long
(3)并发操作时的冲突问题。
3:identity
----不如说是为sqlerver数据库量身定做的。主要适用于sqlserver数据库的自动增长列的表。
4:native
----表示根据不同的数据库采用不同的主键生成策略。比如,当前数据库为sqlserver,则会采用identity,如为oracle,则采用
oracle中的sequence等。区分数据库的不同是以hibernate主配置文件中sessionFactory中配置的数据库方言。
5.uuid
* 唯一主键生成办法。从Hibernate中提取出来
优点:避免了生成ID 时,与数据库的再次交道,性能上较高。但对于有的开发人员不太习惯这种id生成方式,UUID生成的32为的字符串,不同于identity 从1开始的整数。
通常情况下,用的比较多的是代理主键的形式。而且,我们习惯于于让该主键字段能够自动增长,来保证其唯一性。但是,不同的数据库自动增长的方式并不是相同的。如在SQLSERVER中,用identity,MYSQL中,有increment,ORACLE中通常采用sequence。
Rhythmk 学习 Hibernate 03 - Hibernate 之 延时加载 以及 ID 生成策略相关推荐
- Hibernate之加载策略(延迟加载与即时加载)和抓取策略(fetch)
假设现在有Book和Category两张表,表的关系为双向的一对多,表结构如下: 假设现在我想查询id为2的那本书的书名,使用session.get(...)方法: 1 Session session ...
- 基于注解的Spring MVC与JPA如何解决实体的延时加载问题
本文出处:http://blog.csdn.net/chaijunkun/article/details/7673931,转载请注明.由于本人不定期会整理相关博文,会对相应内容作出完善.因此强烈建议在 ...
- LINQ-to-SQL那点事~关于延时加载的性能,微软给出了不错的解决方案
回到目录 LINQ-to-SQL虽然已经属于过去事了,但由于历史原因,还是要关注一下它,呵呵,当微软推出linq to sql之后,最吸引开发者的地方可能就是可视化的数据模型,灵活可控的分部方法及神神 ...
- php延迟加载图片,Html图片延迟加载,图片延时加载库(JavaScript版本)
[温馨提示]源码包解压密码:www.youhutong.com 简介: 和 Lazy Load 一样,它也是一个用于图像延迟加载 JavaScript. 不同的是 Lazy Load 是基于 jQue ...
- TreeView的异步延时加载
TreeView的延时加载 在使用TreeView控件的时候,如果数据量太大,这个TreeView控件加载会很慢,有时甚至加载失败, 为了更好的使用TreeView控件加载大量的数据,采用异步延迟加载 ...
- Entityframework:启用延时加载的主意事项(只为强化记忆)
Check List 无参的.高于私有访问级别的构造方法(经常忘记). 非封闭的类(默认的非封闭的). DbContext 配置要开启(默认是开启的). 因为我喜欢将类型设置为封闭的,提供有参数的构造 ...
- 关于TableView中图片的延时加载(转)
经常我们会用tableView显示很多条目, 有时候需要显示图片, 但是一次从服务器上取来所有图片对用户来浪费流量, 对服务器也是负担.最好是按需加载,即当该用户要浏览该条目时再去加载它的图片. 重写 ...
- FreeSql (二十五)延时加载
FreeSql 支持导航属性延时加载,即当我们需要用到的时候才进行加载(读取),支持1对1.多对1.1对多.多对多关系的导航属性. 当我们希望浏览某条订单信息的时候,才显示其对应的订单详细记录时,我们 ...
- 页面图片延时加载(附实例下载)
页面图片延时加载 转载于:https://blog.51cto.com/2820354/1057576
- Spring : Bean延时加载注解(@Lazy)
1.美图 2.概述 @Lazy:用于标识Bean是否需要延迟加载,延时加载就是在第一次使用的时候才加载.@Lazy的主要作用就是用来减少Spring IOC容器启动的加载时间. 3.源码 @Targe ...
最新文章
- 融资3000万,腾讯大佬随手开发的工具到底有多牛?
- Android的内存优化
- android 富文本框架_五种JavaScript富文本编辑器,总有一款适合你
- python docx库使用样例_Python docx库用法示例分析
- 无锡太湖学院计算机科学与技术宿舍,无锡太湖学院宿舍条件,宿舍环境图片(10篇)...
- docker中的mysql操作
- go实现区块链[3]-遍历区块链与数据库持久化
- Bzoj4870 [SXOI2017]组合数问题
- nftables-howto-zh中文手册(不完整)
- Rem实现自适应初体验
- 机器学习之分类算法--mnist手写体识别
- cordova 修改app名称和图标
- rstudio中读取数据_Rstudio操作数据库
- 做数学建模不得不会的数据特征分析---对比分析
- matlab中应用surf函数画球形物体的三维坐标变换,从球坐标系转换到笛卡尔坐标系
- poj 2044 weather forcast
- 230个形容人性格的英语词汇
- PsychoPy开源免费刺激呈现软件的下载与安装方法
- 方舟生存服务器没有响应怎么办,方舟生存进化搜服务器闪退怎么办? Fata error临时解决办法一览...
- 经济实验室帐号与国泰安数据库地址