- 博客(25)
- 资源 (2)
- 收藏
- 关注
原创 Hibernate中连接数据库的方法概述及DataSource方法
作为一款ORM的工具,Hibernate的一个重要功能是为应用提供对数据库的连接,这被称为ConnectionProvider。Hibernate支持多种对数据库的连接实现:DataSourcec3p0proxoolhikari
2016-06-27 17:16:55 7327 1
原创 Hibernate中持久化上下文的flush操作之一MANUAL
对于Hibernate中的两种持久化上下文,JPA的EntityManager和Hibernate的Session,两者都提供了flush()方法。任何时候在应用中调用该方法,则触发持久化上下文与数据库的同步。除此之外,还可以为Hibernate的Session设置flush模式为MANUAL(JPA的EntityManager不支持),即Hibernate的Session只支持手工执行flu
2016-06-21 15:17:30 939
原创 Hibernate中持久化上下文的flush操作之一ALWAYS
在Hibernate中,持久化上下文Session还支持ALWAYS的flush模式(JPA不支持)。在这种flush模式下,执行native SQL查询也将触发Session执行flush操作,示例如下:Person person = new Person("John Doe");entityManager.persist(person);//flush executedSess
2016-06-21 14:42:14 490
原创 Hibernate中持久化上下文的flush操作之一COMMIT
在Hibernate中持久化上下文的flush操作模式中,JPA还支持COMMIT(JPA只支持AUTO和COMMIT两种)。对于COMMIT的flush操作模式,JPA针对HQL查询和native SQL查询有不同的执行:对于HQL查询,无论是否涉及到了被缓冲的Entity对象,都只会在当前事务提交的时候执行flush操作对于native SQL查询,如果涉及到了被缓冲的Entity
2016-06-21 14:34:29 3726
原创 Hibernate中持久化上下文的flush操作之一AUTO
Hibernate中持久化上下文的flush操作模式默认即为AUTO。在这种模式下,flush操作往往在如下场景下自动执行:遇到持久化上下文的事务提交,那么在事务提交之前执行flush操作在即将执行的HQL查询中涉及到了被缓冲的Entity对象在即将执行的native SQL查询中涉及到了被缓冲的Entity对象下面以JPA的EntityManager为例介绍flushMode
2016-06-21 14:19:06 2210
原创 Hibernate中持久化上下文的flush操作概述
Hibernate中,持久化上下文(如JPA的EntityManager或Hibernate的Session)是所有Entity对象的内存工作空间。持久化上下文作为一个事务级别的“write-behind”缓存,负责维护其中管理的各个Entity对象的状态。任何对Entity对象的状态的修改,首先应用于持久化上下文的内存缓存中,然后在flush操作的时候才会同步存储到对应的数据库中。持久化上下
2016-06-20 16:56:05 1817
原创 Hibernate中Entity对象状态的检测
根据与持久化上下文的联系不同,Hibernate应用中的Entity对象可能处于不同的状态,那么持久化上下文如何检测Entity对象的状态呢?持久化上下文提供了专门的方法检测给定的Entity对象的状态。1. 检测Entity对象是否处于managed/persistent状态对于Hibernate的Native API,示例如下:boolean contained = session
2016-06-17 14:41:59 2263
原创 Hibernate中操作managed/persistent状态的Entity对象使之成为detached状态的Entity对象
Hibernate中处于managed/persistent状态的Entity对象,通过持久化上下文(如Session或EntityManager)能够自动关联到数据库中的对象。这样,在Hibernate应用中对managed/persistent状态的Entity对象的操作将会同步到数据库中。但是,当需要批量修改大量Entity对象时,这种对各个Entity对象的自动同步将会造成数据库性能压
2016-06-17 14:16:49 3308
原创 Hibernate中处于detached状态的Entity对象融合(merge)得到另一个persistent状态的Entity对象
在hibernate应用中,处于detached状态的Entity对象,是指那些在数据库中有对应的记录,但是由于持久化上下文关闭close(),或持久化上下文清空clear(),或者被持久化上下文删除evict(),而导致与持久化上下文不再关联的Entity对象。处于detached状态的Entity对象,虽然在Hibernate应用中仍然可以对其进行操作,但是这些操作的结果无法自动同步存
2016-06-16 15:36:28 959
原创 Hibernate中处于detached状态的Entity对象的再次同步
在Hibernate应用中,处于detached状态的Entity对象,是指那些在数据库中有对应的记录,但是由于持久化上下文关闭close(),或持久化上下文清空clear(),或者被持久化上下文删除evict(),而导致与持久化上下文不再关联的Entity对象。处于detached状态的Entity对象,虽然在Hibernate应用中仍然可以对其进行操作,但是这些操作的结果无法自动同步存储到
2016-06-16 15:22:56 1309
原创 Hibernate中Entity对象的重新加载refresh
Hibernate中处于managed/persistent状态的Entity对象可以通过持久化上下文的refresh()方法,重新加载数据库中的数据。这往往发生在持久化上下文中的Entity对象已经过时,数据库中对应的记录被其他持久化上下文修改的情况下。Hibernate Native API示例如下:Person person = session.byId( Person.cl
2016-06-16 11:55:10 2930
原创 Hibernate中操作处于managed/persistent状态的Entity对象
在持久化上下文(如Session或EntityManager)中管理下的的Entity对象,其状态为managed/persistent的。这样的Entity对象随时可能被Hibernate应用操作,所有的修改都暂时保持在持久化上下文中。在持久化上下文关闭或flush的时候,对Entity对象的所有修改都将自动被同步保存到数据库中。通常无需在Hibernate应用中进行任何同步存储的操作。
2016-06-16 11:42:51 882
原创 Hibernate中通过自然标识符(natural-id)对Entity对象的加载
前述对Entity对象的数据库数据的加载,都是通过Entity对象的标识符。实际上,对于能够唯一区分Entity对象的任何属性,都能够用作加载数据库数据的参数。这种,能够唯一区分Entity对象的属性被称为“自然标识符”,即Entity对象天然拥有的唯一属性。与之相对,Entity对象的标识符未必是天然属性,而是人工或自动生成的属性。与通过标识符加载Entity对象的数据类似,通过Enti
2016-06-13 16:38:33 4115
原创 Hibernate中的即时加载
与延迟加载相对的是,在获取Entity对象的引用的同时,加载Entity对象的数据。对于Hibernate的Native API,示例如下:Person person = session.get( Person.class, personId );或者Person person = session.byId( Person.class ).load( personId );
2016-06-13 14:44:14 461
原创 Hibernate中的延迟加载
Hibernate中,对于已经持久化了的Entity对象,其数据存储在数据库中。在Hibernate应用中创建一个新对象时,如果该对象引用了另一个Entity对象,那么可以仅仅创建被引用Entity对象的引用,而不实际加载被引用的Entity对象的数据。这也就是Hibernate的延迟加载。对于Hibernate的Native API,示例如下:Book book = new Book
2016-06-13 14:31:45 348
原创 Hibernate中的删除一个已经持久化了的Entity对象
在Hibernate中,持久化了的Entity对象的状态是managed/persistent。对持久化了的Entity对象执行删除操作,则Entity对象的状态变成removed。removed状态的Entity对象可能仍然存在于Hibernate的缓存中,也可能仍然存在于数据库中,但是Hibernate同步缓存的时候将会同时从Hibernate缓存和数据库中删除。对于Hibernate
2016-06-12 22:09:24 3413
原创 Hibernate中的持久化一个新创建的Entity对象
在Hibernate应用中,新创建一个Entity对象,其状态为transient。要将该Entity对象转变为managed/persistent状态,可以有save()、persist()两种方法,示例如下。save方法:Person person = new Person();person.setId( 1L );person.setName("John Doe");se
2016-06-12 17:23:20 1468
原创 Hibernate中的持久化上下文与Entity对象的状态
Hibernate实质上是一种ORM的解决方案。在这种ORM中,与关系数据库中存储的数据相对应的,就是Hibernate中的持久化上下文中的对象。数据库中的数据由关系数据库维护,Hibernate中的对象由持久化上下文维护。在Hibernate中,提供了两种持久化上下文的实现,一种是Hibernate自身提供的Native API,即org.hibernate.Session。另一种是Hi
2016-06-12 17:01:15 1656
原创 Hibernate 5的启动过程分析之EntityManagerFactory
Hibernate作为一个JPA实现,其启动过程与Hibernate的Native SessionFactory实例的构建过程有很大差异。作为JPA实现,Hibernate必须实现对JPA EntityManagerFactory实例的构建。JPA EntityManagerFactory实例的构建又可以分为2种实现方式,一种是以兼容JPA标准的方式启动(推荐),另一种是以软件厂商私有的独
2016-06-08 12:51:00 3690
原创 Hibernate 5的启动过程分析之SessionFactory
通过前面的学习,我们知道Hibernate提供了2组数据访问API,一个是JavaEE标准的JPA,另一个是Hibernate独有的Hibernate Native API。对应地,Hibernate 5的启动过程也分为两种情况,一种是JPA的EntityManagerFactory实例的构建过程,另一种是Hibernate的Native SessionFactory实例的构建过程。
2016-06-08 12:29:11 4302
原创 Hibernate中的Entity类之间的继承关系之四TABLE_PER_CLASS
对于Hibernate提供的4种兼容JPA的映射策略,这里介绍第四种table-per-concrete-class策略。事实上,从数据库表结构看,这种策略下的每个Entity类都对应一个独立的数据库表。在这种策略中,存在如下特征:父子Entity类也对应一个数据库表 父表中无需设置discriminator列 子表中不仅包含子Entity类特有的全部属性,还包括从父Entity类继承...
2016-06-07 23:34:15 4682 3
原创 Hibernate中的Entity类之间的继承关系之三JOINED
对于Hibernate提供的4种兼容JPA的映射策略,这里介绍第三种Joined table,也被称为table-per-subclass策略。 在这种策略中,存在如下特征:父子Entity类都对应各自的数据库表父表中无需设置discriminator列子表中的主键ID,也是子表的外键,用以指向父表的主键ID。默认父子表中的主键名字相同,也可以在子Entity类中通过如下标注给出列
2016-06-07 22:46:00 1508
原创 Hibernate中的Entity类之间的继承关系之二SINGLE_TABLE
为了解决Entity类的继承与关系数据库表的对应不匹配问题,Hibernate提供了4种兼容JPA的策略,这里介绍第二种Single table。在这种策略中,存在如下特征:数据库中只有一个表,其中包含了继承相关的所有父子Entity类的属性父Entity中有一个特殊的属性作为区分标识1.Single table策略的实现父Entity类定义如下:@Enti
2016-06-06 17:11:25 4253
原创 Hibernate中的Entity类之间的继承关系之一MappedSuperclass
在Hibernate中,Entity类可以继承Entity类或非Entity类。但是,关系数据库表之间不存在继承的关系。那么在Entity类之间的继承关系,在数据库表中如何表示呢?Hibernate提供了4种策略解决Entity类的继承与关系数据库表的对应不匹配问题。这里介绍第一种MappedSuperclass。在这种策略中,存在如下特征:只在Entity类之间存在继承关
2016-06-03 14:07:56 5811
原创 Zuora在线测试题解之Three Page Path
题目记不清楚了,大概是给出用户访问页面的记录(user, page),要求给出最经常被访问的前M个路径,每个路径至少包含n个页面。定义类如下,测试通过。1. 原始数据package com.zuora.interview.path3page;public class UserPage { private String user; private String page;
2016-06-02 14:36:16 1215
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人