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 生成策略相关推荐

  1. Hibernate之加载策略(延迟加载与即时加载)和抓取策略(fetch)

    假设现在有Book和Category两张表,表的关系为双向的一对多,表结构如下: 假设现在我想查询id为2的那本书的书名,使用session.get(...)方法: 1 Session session ...

  2. 基于注解的Spring MVC与JPA如何解决实体的延时加载问题

    本文出处:http://blog.csdn.net/chaijunkun/article/details/7673931,转载请注明.由于本人不定期会整理相关博文,会对相应内容作出完善.因此强烈建议在 ...

  3. LINQ-to-SQL那点事~关于延时加载的性能,微软给出了不错的解决方案

    回到目录 LINQ-to-SQL虽然已经属于过去事了,但由于历史原因,还是要关注一下它,呵呵,当微软推出linq to sql之后,最吸引开发者的地方可能就是可视化的数据模型,灵活可控的分部方法及神神 ...

  4. php延迟加载图片,Html图片延迟加载,图片延时加载库(JavaScript版本)

    [温馨提示]源码包解压密码:www.youhutong.com 简介: 和 Lazy Load 一样,它也是一个用于图像延迟加载 JavaScript. 不同的是 Lazy Load 是基于 jQue ...

  5. TreeView的异步延时加载

    TreeView的延时加载 在使用TreeView控件的时候,如果数据量太大,这个TreeView控件加载会很慢,有时甚至加载失败, 为了更好的使用TreeView控件加载大量的数据,采用异步延迟加载 ...

  6. Entityframework:启用延时加载的主意事项(只为强化记忆)

    Check List 无参的.高于私有访问级别的构造方法(经常忘记). 非封闭的类(默认的非封闭的). DbContext 配置要开启(默认是开启的). 因为我喜欢将类型设置为封闭的,提供有参数的构造 ...

  7. 关于TableView中图片的延时加载(转)

    经常我们会用tableView显示很多条目, 有时候需要显示图片, 但是一次从服务器上取来所有图片对用户来浪费流量, 对服务器也是负担.最好是按需加载,即当该用户要浏览该条目时再去加载它的图片. 重写 ...

  8. FreeSql (二十五)延时加载

    FreeSql 支持导航属性延时加载,即当我们需要用到的时候才进行加载(读取),支持1对1.多对1.1对多.多对多关系的导航属性. 当我们希望浏览某条订单信息的时候,才显示其对应的订单详细记录时,我们 ...

  9. 页面图片延时加载(附实例下载)

    页面图片延时加载 转载于:https://blog.51cto.com/2820354/1057576

  10. Spring : Bean延时加载注解(@Lazy)

    1.美图 2.概述 @Lazy:用于标识Bean是否需要延迟加载,延时加载就是在第一次使用的时候才加载.@Lazy的主要作用就是用来减少Spring IOC容器启动的加载时间. 3.源码 @Targe ...

最新文章

  1. 融资3000万,腾讯大佬随手开发的工具到底有多牛?
  2. Android的内存优化
  3. android 富文本框架_五种JavaScript富文本编辑器,总有一款适合你
  4. python docx库使用样例_Python docx库用法示例分析
  5. 无锡太湖学院计算机科学与技术宿舍,无锡太湖学院宿舍条件,宿舍环境图片(10篇)...
  6. docker中的mysql操作
  7. go实现区块链[3]-遍历区块链与数据库持久化
  8. Bzoj4870 [SXOI2017]组合数问题
  9. nftables-howto-zh中文手册(不完整)
  10. Rem实现自适应初体验
  11. 机器学习之分类算法--mnist手写体识别
  12. cordova 修改app名称和图标
  13. rstudio中读取数据_Rstudio操作数据库
  14. 做数学建模不得不会的数据特征分析---对比分析
  15. matlab中应用surf函数画球形物体的三维坐标变换,从球坐标系转换到笛卡尔坐标系
  16. poj 2044 weather forcast
  17. 230个形容人性格的英语词汇
  18. PsychoPy开源免费刺激呈现软件的下载与安装方法
  19. 方舟生存服务器没有响应怎么办,方舟生存进化搜服务器闪退怎么办? Fata error临时解决办法一览...
  20. 经济实验室帐号与国泰安数据库地址

热门文章

  1. java提高篇(十九)-----数组之二
  2. 基于JAVASCRIPT操作XML的无刷新分页
  3. WPF: WrapPanel 容器的数据绑定(动态生成控件、遍历)
  4. XAF 应用程序模型架构
  5. 数据发现:凭什么登顶富豪榜?
  6. mysql 是否有归档模式_数据库的归档模式和非归档模式的区别
  7. mysql 记录_mysql记录耗时的sql实例详解
  8. SonarQube 7.7默认数据库连接方法
  9. c#使用资源文件完成国际化
  10. 机器学习(一):数据预处理