Hibernate 加载数据 有get,跟Load

1、懒加载:

使用session.load(type,id)获取对象,并不读取数据库,只有在使用返回对象值才正真去查询数据库。

@Test
public 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回话已经关闭 ,此时则抛出异常:

  @Test
public 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方法直接读取数据库:

@Test
public 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(...)方法: Session session=H ...

  2. sping data jpa 共享主键 OneTonOne 延时加载

    当我们使用spring boot创建项目时,系统默认使用的是如下parent. <parent> <groupId>org.springframework.boot</g ...

  3. MyBatis入门(五)---延时加载、缓存

    一.创建数据库 1.1.建立数据库 /* SQLyog Enterprise v12.09 (64 bit) MySQL - 5.7.9-log : Database - mybatis ****** ...

  4. Hibernate系列之ID生成策略

    一.概述 hibernate中使用两种方式实现主键生成策略,分别是XML生成id和注解方式(@GeneratedValue),下面逐一进行总结. 二.XML配置方法 这种方式是在XX.hbm.xml文 ...

  5. js实现图片延时加载的原理

    实现原理: 附:(http://www.cnblogs.com/fishtreeyu/archive/2011/03/12/1982067.html) 把所有需要延时加载的图片改成如下的格式: < ...

  6. 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理

    服务器文档下载zip格式   刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...

  7. hibernate ID生成策略配置

    1.Student.hbm.xml配置 <hibernate-mapping package="com.wxh.hibernate.model"> <class ...

  8. JAVA的单例模式与延时加载

    延迟加载(lazy load)是(也称为懒加载),也叫延迟实例化,延迟初始化等,主要表达的思想就是:把对象的创建延迟到使用的时候创建,而不是对象实例化的时候创建.延迟加载机制是为了避免一些无谓的性能开 ...

  9. Yaf零基础学习总结5-Yaf类的自动加载

    Yaf零基础学习总结5-Yaf类的自动加载 框架的一个重要功能就是类的自动加载了,在第一个demo的时候我们就约定自己的项目的目录结构,框架就基于这个目录结构来自动加载需要的类文件. Yaf在自启动的 ...

随机推荐

  1. Web开发中常用的定位布局position

    定位布局就是为开发提供了更好的布局方式,可以根据需求给相应的模块设定相应位置,从而使界面更佳丰富,代码更佳完美. position是CSS中非常重要的一个属性,通过position属性,我们可以让元素 ...

  2. 创建对象并生成结果的3个步骤-Chapter 3 P38

    必须完成3个步骤才能创建对象并生成结果: 1 创建对象   namespace LanguageFeatures { public class Product { public int Product ...

  3. 第一个mpvue小程序开发总结

    前言 说起小程序,其实在去年我都还只试着照着官方文档写过demo的,不过现在这家公司小程序做得比较多,我来之后也参与了几个小程序的开发了,最开始那几个是用的wepy,最近一个开始转用mpvue开发,最 ...

  4. 在ubuntu16中部署Django使用memcached作为缓存

    Django支持很多缓存系统,如 文件系统缓存. 数据库缓存. 内存缓存(Memcached),其中,Memcached是最快的,没有之一,是绝配.因为所有的缓存数据都放在内存,没有了IO延迟,也没有 ...

  5. 身份证&银行卡识别方案

    一.  调用第三方服务 腾讯云OCR识别: 实现方法:Post图片 URL到腾讯云服务器.Post图片文件 到腾讯云服务器 b.    报价: 月接口调用总量 0<调用量≤1000 1000&l ...

  6. generator.xml文件与相关配置插件

    一,generator.xml配置信息 1 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ...

  7. Django 之 用redis存储session

    方案I: 1. 安装 django-redis liuqian@ubuntu:~$ pip install django-redis dango-redis 官方文档:http://niwinz.gi ...

  8. SendMessage wMsg常量值参考

    namespace Core.WinAPI { /// <summary> /// wMsg参数常量值: /// </summary> public static class ...

  9. start-stop-daemon自动启动、关闭后台程序参数传递

    /************************************************************************* * start-stop-daemon自动启动.关 ...

  10. spring与hibernate注解及XML方式集成

    spring与hibernate注解及XML方式集成 Hibernate Xml方式 该种方式需要在sessionFactory中引入对应的hbm.xml文件,样例如下: <!-- spring ...