`
mwmw
  • 浏览: 3946 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

Hibernate相关随写

 
阅读更多

项目在用Hibernate,其实Data Access层用什么都是用,没有什么原因,很多面试官会堂而皇之的问一句:你们为什么用Hibernate,这个问题问的很好,很多人会回答的也很有意思,有的说:Hibernate是做Mapping的,可以让代码更简单,编写起来不会变得复杂,很明显这没有回答面试官的问题,DA这一层可以用的东西太多了,ibatis就是一个很好的例子。 都是把编程变得简单,其实最简单的回答是,我来这个项目的时候,他们就在用了,一直在用,看着还不错也就一直用下去了。

 

我为什么用Hibernate,说实话,我不知道,就是我来的时候,他们已经在用了,再说上一句:这是最流行的框架,如此而已。当然也会有人说,用hibernate会有系统问题,其实也是在胡说,在为自己的性能差找理由,而且还是一个堂而皇之的理由。hibernate性能差吗?ibatis性能又能好哪里去呢?其实就看你怎么用了。这样的问题就跟为什么用MySQL而不用SQLServer一样。

 

这两天无聊看了一些Hibernate相关的文章,无非就是load/get的区别,这个面试必须会问的问题,绕了很多人,如果这个问题不会,面试官就会下一个定义,这丫的面试者只会用hibernate不知道其中根本原因,其实,面试的人又能真正的了解其中的根本原因吗? 我也问过别人这个问题,不过我问的时候我自己都感到心虚,最经典的回答无非就是: get会从数据库里去拿,load从缓存里面去那里,get如果拿不到的话就返回一个空对象,而load拿不到的话就会抛出一个异常。但是这个基本上是在忽悠的回答。1. load默认是数据库已经存在了,先看一下session缓存里面是不是有,如果有直接返回,如果没有直接返回一个proxy,当运用时候,先去二级缓存里面去取,如果没有那就去数据库里取,如果还是取不到那就抛出一个exception。 get就是直接缓存里面找一下,如果找不到,直接数据库里面找,如果还没有那就返回一个空的对象。

 

又会有人说道lazy load的问题,上来先会问一句:N+1问题是什么,解决方案是什么; 茫然之后,会回答:N+1问题是,当我们访问数据库的时候如果有一个一对多的关系的时候,当访问这个一的时候,数据库会把一load出来之后,再分N次加载那个N的东东。那解决方案是什么呢? Lazy Load应该是一个解决方案吧,起码是能解决这个问题,原因很简单当用的时候在让他去做那个N,能够解决一点这个问题。 那还有什么解决方案呢,batch fetching也是算是一种解决方案吧,毕竟一次去很多不会是N+1 而是会N/M +1. 还有一个每个人都会提出的二级缓存的问题,如果把这个N的东西放在缓存里面,一切也就不会去touch那么多次数据库了,这也是一个很好的解决方案。

 

还有一个东东是fetch,好几种fetch呢,什么batch,select, join,subselect,区别又是什么呢,select最简单,就是发语句去select呗,有什么就select什么,set的话就发N个,除非你设置了Lazy,那就等到用的时候再去select,但是还是N个东东,当然这个时候也是去创建一个stub,而不是一个空的东西。其次是join,就是用out join把所有的东西都取出来,subselect不懂是什么,没有用过,batch就是一次取几个,就是后面去取set东西的时候一次去取几个。默认的是select 加lazy=“true”。

 

inverse-倒转的,谁去维护比较好呢,看过一些文章,发现其实最好的还是让儿子去维护吧,不要去建议双向的关系,如果父亲也去维护的话,容易产生很多的update语句,所以父亲这边设置成false,而儿子那边设置成true。

 

还有一个就是transaction一样的被绕来绕去的东东,我们可以创建sessionfactory,但是建立的时候一般会很浪费资源,所以一般只是在启动的时候创建这个东东,另外我们也可用JDBC 去管理transaction也可以用JTA去管理transaction,hibernate只是去引用别人的这两个东东。

 

托管环境和不托管环境会有点不同,不托管环境一般都用JDBCTransaction,他会去beginTransaction,之后去做事情。也可以在托管环境中去做,一般就用JTA提供的解决方案,例如:你只需要引用相应的CMTTransactionFactory就可以了例如:

 

<attribute name="TransactionManagerLookupStrategy">org.hibernate.transaction.JBossTransactionManagerLookup</attribute>

 之后,系统会自动维护transaction,让编程变得很简单粗暴。你只需要做简单的session session = sf.getCurrentSession(); sessionFactory会去维护一切他要维护的东西。你也不需要去从session里面去做事情了,也不用去openTransaction了。

 

部署:JMX是一个很好的方式,以JMX的形式,透过JNDI找到相应的datasource自动的绑定JTA事务管理访问。

 

这篇文章就像老太太的裹脚,又臭又长,也就是随便写写,权当是一个记忆,一个回味,错错对对,已经不重要了.

 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    hibernate+ehcache jar包

    - 添加Ehcache相关jar包到项目类路径,如题目中提到的`ehcache-core-2.6.8.jar`和`hibernate-ehcache-4.1.0.Final.jar`。 - 在Hibernate配置文件(如`hibernate.cfg.xml`)中启用二级缓存并指定Ehcache为缓存提供者...

    Hibernate性能优化:一级缓存

    压缩包文件“hibernate_cache_level1”可能包含与一级缓存相关的示例代码、配置文件或文档,可以帮助开发者更深入地理解一级缓存的实现和优化。例如,其中可能有示例展示了如何配置SessionFactory的缓存区域大小,...

    hibernate缓存简介

    一级缓存也被称为session级或事务缓存,因为它与事务的生命周期紧密相关。 二级缓存则是SessionFactory级别的,可以被同一SessionFactory创建的所有Session共享,具有更长久的生命周期。二级缓存可以实现跨事务的...

    hibernate 缓存策略

    1. **生命周期与Session绑定**:一级缓存存在于Session内部,当Session关闭时,一级缓存中的所有对象也会随之失效。 2. **独占性**:每个Session都有自己的独立一级缓存,不同Session之间的缓存互不干涉。 3. **事务...

    Eclipse从入门到精通(第1版+第2版)随书光盘

    Eclipse从入门到精通 (第1版+第2版)随书光盘 陈刚 清华大学出版社 第1版 2005 年6月 第2版 2007 年7月 国内第一本详细讲解SWT/JFace开发的书; 国内第一本详细讲解如何开发Eclipse插件的书; 一本写给程序员的书,是...

    Java通用代码生成实用程序XDoclet(源码包)

    像@hibernate.clas、@hibernate.property、@struts.action-forward等等这些特定的注释标签需要去查XDoclet的相关文档了,Xdoclet对目前流行的多种框架、技术都提供了相关的支持。 这样,我们就能在使用ant编译工程...

    《J2ME Game Programming》随书源代码

    《J2ME Game Programming》随书源代码是一个与Java Micro Edition (J2ME)游戏开发相关的资源包,其中包含了用于学习和实践J2ME游戏编程的源代码示例。J2ME是Java平台的一个子集,主要用于嵌入式设备和移动设备上的...

    软件开发求职信范文.doc.doc

    6. 软件开发求职信的特点:软件开发求职信需要强调自己的专业知识和技能,例如java语言、jsp、struts、struts2、spring2、hibernate3等流行的编程技术,并且要强调自己的实践经验和项目经验。 7. 求职信的格式:...

    基于javaEE健康管理系统SSH设计软件源码+数据库+word毕业论文文档.zip

    根据教师的相关信息,计算其每天所需热量,给出一周的推荐菜单。 (3)教师健康日志: 用户可以记录自己健康日记,记录每一天的睡眠,饮酒,吸烟,血压,体重等情况。 (4)教师体检管理: 教师可通过该平台...

    ssh公司门户网站

    1. **源代码**:包括Struts的Action类、Spring的服务接口和实现、Hibernate的实体类以及相关的DAO(数据访问对象)。 2. **配置文件**:Spring的bean配置文件(如applicationContext.xml)、Struts的配置文件...

    spring data实战源码

    4. **JPA支持**:Spring Data JPA允许开发者在不写任何SQL的情况下利用JPA进行数据访问,它提供了与ORM框架(如Hibernate)的无缝集成。 5. **NoSQL支持**:Spring Data也支持非关系型数据库,例如MongoDB,提供了...

    JAVA相关面试题,Spring面试题

    浏览器会将这些信息随请求一起发送到服务器,从而允许服务器识别用户。 #### 八、Servlet的基本概念? - **Servlet**: Servlet是Java Web开发的核心组件之一,用于处理客户端请求并生成响应。Servlet是一个Java类...

    Java面试题2019

    随着技术的不断发展,Java开发者的需求也在持续增长,面试题目也随之多样化。以下是一些基于“Java面试题2019”主题的重要知识点: 1. **Java基础**: - 类与对象:理解面向对象编程的基本概念,如封装、继承、...

    MyEclipse全面详解.pdf

    本书的目标读者为具有一定Java基础并希望提高开发效率的程序员、各大中专院校以及培训机构的相关师生、希望提升工作效率的开发团队成员以及广泛的编程爱好者。本书对MyEclipse的讲解采取了从基础到高级的进阶方式,...

Global site tag (gtag.js) - Google Analytics