如何学习hibernate源码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何学习hibernate源码相关的知识,希望对你有一定的参考价值。

参考技术A   学习 Hibernate 源码一
  1. 下载 hibernate 源码,并构建起 eclipse 项目
  ( 1 ) hibernate 的源代码采用 git 管理,安装 git 客户端以后,通过点击 github.com/hibernate/hibernate-orm 页面右侧的“ Clone in Desktop ”可启动客户端将代码 clone 到本地。当然也可以直接使用
  git clone git://github.com/hibernate/hibernate-orm.git
  命令下载代码。
  下载完毕后,打开根目录下的 readme 文件,可以看到详细的把源代码构建为不同 IDE 项目的说明;以及其他的一些信息。
  对应文档的网站链接:
  community.jboss.org/wiki/BuildingHibernateORM4x5x
  构建 IDE 部分:
  Eclipse
  To create the Eclipse project files you can run
  After changes to the dependencies you need to clean the project files and recreate them:
  ./gradlew cleanEclipse eclipse
  See also Contributing to Hibernate using Eclipse
  Idea
  To create the Idea project files you can run
  ./gradlew idea
  After changes to the dependencies you need to clean the project files and recreate them:
  ./gradlew cleanIdea idea
  此处的 gradle 是 hibernate 所使用的自动构建工具,官网地址为:
  .gradle.org/
  下载地址为: .gradle.org/downloads ,选择一个版本进行下载
  此处是 Hibernate 团队阐述其从 Maven 迁移到 Gradle 的原因: community.jboss.org/wiki/GradleWhy
  至于 grable ,有时间会深入学习一下,感兴趣的同学可以看看这位博主的博客:
  .blogjava.net/wldandan/archive/2012/06/26/381532.html
  言归正传,下载 grable 后,解压,我将其解压到了 C 盘根目录,解压完毕的 grable 所在目录为: C:\gradle-1.7 ,将其子目录 C:\gradle-1.7\bin 目录加入系统的 Path 变量
  编译代码为 eclipse 项目:
  ( 1 )进入 hibernate 源码的根目录:
  cd C:\Users\Administrator\Documents\GitHub\hibernate-orm
  ( 2 )执行 gradlew.bat eclipse
  接着会自动下载项目所需要的依赖项,具体输出如下:
  C:\Users\Administrator\Documents\GitHub\hibernate-orm >gradlew.bat eclipse
  Creating properties on demand (a.k.a. dynamic properties) has been deprecated and is scheduled to be removed in Gradle 2.0. Please read gradle.org/docs/current/dsl/org.gradle.api.plugins.ExtraPropertiesExtension.html for information on
  Deprecated dynamic property: "exportPackageVersion" on "project ':documentation'", value: "4.3.0".
  Deprecated dynamic property "exportPackageVersion" created in multiple locations.
  FAILURE: Build failed with an exception.
  * Where:
  Build file 'C:\Users\Administrator\Documents\GitHub\hibernate-orm\build.gradle' line: 85
  * What went wrong:
  A problem occurred evaluating root project 'hibernate-orm'.
  > org/hibernate/build/gradle/publish/auth/maven/AuthenticationManager : Unsupported major.minor version 51.0
  * Try:
  Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
  此时我去查看我的环境变量, JAVA_HOME 指向的是 64 位的 JDK6 ,将其指向 32 位 JDK7 后再次执行
  gradlew.bat eclipse
  发现此时 gradlew 又去下载了其他的依赖包,查看 hibernate-rom 目录下的 libraries.gradle 文件,可以看到 hibernate 的依赖包。
  重新编译过程中还是报错了,具体错误:
  :hibernate-core:compileJava
  警告 : [options] 未与 -source 1.6 一起设置引导类路径
  C:\Users\Administrator\Documents\GitHub\hibernate-orm\hibernate-core\src\main\java\org\hibernate\annotations\Loader.java:38: 错误 : 编码 GBK 的不可映射字符
  * @author L 锟絪 zl 锟 ?Benke
  ^
  C:\Users\Administrator\Documents\GitHub\hibernate-orm\hibernate-core\src\main\java\org\hibernate\annotations\ResultCheckStyle.java:29: 错误 : 编码 GBK 的不可映射字符
  * @author L 锟絪 zl 锟 ?Benke
  ^
  C:\Users\Administrator\Documents\GitHub\hibernate-orm\hibernate-core\src\main\java\org\hibernate\annotations\SQLDelete.java:37: 错误 : 编码 GBK 的不可映射字符
  * @author L 锟絪 zl 锟 ?Benke
  ^
  C:\Users\Administrator\Documents\GitHub\hibernate-orm\hibernate-core\src\main\java\org\hibernate\annotations\SQLDeleteAll.java:37: 错误 : 编码 GBK 的不可映射字符
  * @author L 锟絪 zl 锟 ?Benke
  ^
  C:\Users\Administrator\Documents\GitHub\hibernate-orm\hibernate-core\src\main\java\org\hibernate\annotations\SQLInsert.java:37: 错误 : 编码 GBK 的不可映射字符
  * @author L 锟絪 zl 锟 ?Benke
  ^
  C:\Users\Administrator\Documents\GitHub\hibernate-orm\hibernate-core\src\main\java\org\hibernate\annotations\SQLUpdate.java:37: 错误 : 编码 GBK 的不可映射字符
  * @author L 锟絪 zl 锟 ?Benke
  ^
  注 : 某些输入文件使用或覆盖了已过时的 API 。
  注 : 有关详细信息 , 请使用 -Xlint:deprecation 重新编译。
  注 : 某些输入文件使用了未经检查或不安全的操作。
  注 : 有关详细信息 , 请使用 -Xlint:unchecked 重新编译。
  1 个警告
  google 了一下,貌似是区域语言设置的问题,需要修改为“英语(英国)”,但编译并没用中断,接着编译。我将控制面板中的区域语言设置修改后,继续观察,看其是否还会报同样的错误。
  最终还是失败了:
  :hibernate-entitymanager:compileJava
  警告 : [options] 未与 -source 1.6 一起设置引导类路径
  C:\Users\Administrator\Documents\GitHub\hibernate-orm\hibernate-entitymanager\src\main\java\org\hibernate\jpa\AvailableSettings.java:290: 错误 : 编码 GBK 的不可映射字符
  * contains 钬淐 REATE SCHEMA 钬 ?commands. If this property is not supplied (or is explicitly @code false), the
  ^
  注 : 某些输入文件使用或覆盖了已过时的 API 。
  注 : 有关详细信息 , 请使用 -Xlint:deprecation 重新编译。
  注 : 某些输入文件使用了未经检查或不安全的操作。
  注 : 有关详细信息 , 请使用 -Xlint:unchecked 重新编译。

hibernate学习 六 Hibernate缓存

缓存

   如果在集群环境下使用Hibernate时,(集群有节点A ,节点B) 当请求,发往A节点,A在数据库中修改了一条记录,然后节点B的缓存中如何实时的更新节点A修改的新数据
         hibernate本身的一级缓存不能跨越进程, 需要第三方缓存的支持, Ehcache缓存就可以实现

Hibernate缓存:
  一级缓存:
       在同一个Session里面,第一次调用get()方法, Hibernate先检索缓存中是否有该查找对象,发现没有,Hibernate发送SELECT语句到数据库中取出相应的对象,然后将该对象放入缓存中,以便下次使用,第二次调用get()方法,Hibernate先检索缓存中是否有该查找对象,发现正好有该查找对象,就从缓存中取出来,不再去数据库中检索,没有再次发送select语句。
一个session不能取另一个session中的缓存。
二级缓存:
SessionFactory级别的缓存,可以跨越Session存在,可以被多个Session所共享。
(1)经常被访问

(2)改动不大

(3)数量有限

(4)不是很重要的数据,允许出现偶尔并发的数据。
用户的权限:用户的数量不大,权限不多,不会经常被改动,经常被访问。例如组织机构。

Hibernate查找对象如何应用缓存?
  当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;

  查不到,如果配置了二级缓存,那么从二级缓存中查;

  如果都查不到,再查询数据库,把结果按照ID放入到缓存, 删除、更新、增加数据的时候,同时更新缓存。

 

 

QBC(Query By Criteria) API提供了检索对象的另一种方式,:


Hibernate取部分字段?
  QBC是HQL更上层的封装,会查询所有字段。要想只使用部分字段,需要像写SQL一样写HQL。
  一种方案是:给实体类再加一个构造函数,构造函数只有必须的字段,这样就不会全查( String hql=”select new Employee(e.id,e.name_cn) from Employee e”; )
  另外一种是直接写SQL,得到的东西再组装成对象。Query query = getSession().createQuery(hql).setResultTransformer((Transformers.aliasToBean(clazz)));
  DetachedCriteria的投影方式可以取得部分字段。

hibernate多表联合查询?
  HQL:配置关系的话,可以不用join; 不配关系的话,HQL中写join;
  QBC的话,用createCriteria可以实现多表关联。Criteria repA=cri.createCriteria("repAward", CriteriaSpecification.LEFT_JOIN);
  Criteria works=cri.createCriteria("works", CriteriaSpecification.LEFT_JOIN);

HIbernate session 与 connection关系?

  • session与connection,是多对一关系,每个session都有一个与之对应的connection,一个connection不同时刻可以供多个session使用。
  • 多个session与一个connection绑定,底层操作数据库的时会进行同步。
  • 如果某个connection正在被某个session占用, open一个session,则创建一个新的connection与之对应。
  • 有连接池的情况下,session关闭后,connection不一定关闭, 还可以查询到应用占用的连接,若超过最大空闲时间,被连接池回收释放。
  • 有连接池的情况下,session使用完后不关闭,该connection被占用,若超过连接回收时间,也可被连接池回收释放。
  • 非连接池情况下,一个session占用一个connection,若不关闭,该connection无法释放。
  • 每个open的session都需要close。

 

连接池是多个端口吗?

  套接字是计算机网络中应用层和传输层之间的接口。如果应用程序需要使用网络功能,只需要调用套接字API即可。每个进程可以使用多个套接字,每个套接字都有一个标识符。对于TCP套接字,其标识符结构为:源IP,源端口,目的IP和目的端口。对于客户服务器架构的网络程序,服务器进程的端口是周知的,例如MySQL5543,而客户进程端口是随机分配的。也就是说,每个数据库连接对象,和数据库服务器通信都依赖于它自己的套接字,而这个套接字的端口号是各不相同的,尽管同属于一个进程。
























以上是关于如何学习hibernate源码的主要内容,如果未能解决你的问题,请参考以下文章

hibernate学习

Hibernate学习笔记_02

hibernate学习 六 Hibernate缓存

Hibernate学习笔记

Hibernate学习笔记

Hibernate学习