`

Hibernate要点

阅读更多

1.两种配置文件:
   A.hibernate.cfg.xml    和    B.hibernate.properties

   A中可含映射文件的配置,而B中hard codes加映射文件。

   A。Configuration config=new Configuration().config();
   B. Configuration config=new Configuration();
      config.addClass(TUser.class);


2.你不必一定用hibernate.cfg.xml或hibernate.properties这两文件名,
    你也不一定非得把配置文件放在Classes下,
    File file=new File("c:\\sample\\myhibernate.xml");
    Configuration config=new Configuration().config(file);

3. session.Flush()
    强制数据库立即同步,当用事务时,不必用flush,事务提交自动调用flush
    在session关闭时也会调用flush


4. Hibernate总是使用对象类型作为字段类型

5. XDoclet专门建立了hibernate doclet,就是在java代码上加上一些
    java docTag,后来再让XDoclet分析该java代码,生成映射文件;

6.HQL子句本身大小写无关,但是其中出现的类名和属性名必须注意大小写区分。

7.关系:
   Constrained : 约束,表明主控表的主键上是否存在一个外键(foreigh key)
    对其进行约束。

   property-ref:关联类中用于与主控类相关联的属性名,默认为关联类的主键属性名

   单向一对多需在一方配置,双向一对多需在双方进行配置

8.lazy=false:被动方的记录由hibernate负责记取,之后存放在主控方指定的
   Collection类型属性中

9. java.util.Set或net.sof.hibernate.collecton.Bag类型的Collection


10.重要:inverse:用于标识双向关联中的被动方一端。
          inverse=false的一方(主控方)负责维护关联关系.默认值:false

11.batch-size:采用延迟加载特征时,一次读入的数据数昨。

12.一对多通过主控方更新(主控方为一方时)

    user.getAddresses().add(addr);
    session.save(user);//通过主控对象级联更新  

13.在one-to-many 关系中,将many 一方设为主动方(inverse=false)将有助性能
    的改善。在一方设置关系时,inverse=true,即将主控权交给多方,
    这样多方可主动从一方获得foreign key,然后一次insert即可完工。


    addr.setUser(user);//设置关联的TUser对象
    user.getAddresses().add(addr);
    session.save(user);//级联更新

14.只有设为主控方的一方才关心(访问)对方的属性,被动方是不关心对方的属性的。

15.one-to-many与many-to-one节点的配置属性不同:
    一对多关系多了lazy和inverse两个属性
    多对多节点属性:column:中间映射表中,关联目标表的关联字段
                    class:类名,关联目标类
                    outer-join:是否使用外联接    

    注意:access是设置属性值的读取方式。


         column是设置关联字段。


16.多对多,注意两方都要设置inverse和lazy,cascade只能设为insert-update
    多对多关系中,由于关联关系是两张表相互引用,因此在保存关系状态时必须对双方同时保存。

    group1.getRoles().add(role1);
    role1.getGroups().add(group1);

    session.save(role1);
    session.save(group1);

17.关于vo和po
    vo经过hibernate容量处理,就变成了po(该vo的引用将被容器保存,并且在session关闭时flush,因此po如果再传到其它地方改变了,就危险了)

    vo和po相互转换:BeanUtils.copyProperties(anotherUser,user);

18.对于save操作而言,如果对象已经与Session相关联(即已经被加入Session的实体容器中),则无需进行具体的操作。因为之后的Session.flush过程中,Hibernate
会对此实体容器中的对象进行遍历,查找出发生变化的实体,生成并执行相应的update
语句。

19.如果我们采用了延迟加载机制,但希望在一些情况下,实现非延迟加
载时的功能,也就是说,我们希望在Session关闭后,依然允许操作user的addresses
属性
Hibernate.initialize方法可以通过强制加载关联对象实现这一功能:
这也正是我们为什么在编写POJO时,必须用JDK Collection接口(如Set,Map),
而非特定的JDK Collection实现类(如HashSet、HashMap)申明Collection属性的
原因。

20.事务:从sessionFactory获得session,其自动提交属性就已经关闭(AutoCommit=false),此时若执行了jdbc操作,如果不显式调用session.BeginTransaction(),是不会执行事务操作的。

    jdbc transaction:基于同一个session(就是同一个connection)的事务;
    jta   transaction:跨session(跨connection)事务.

    对于jta事务,有三种实现方法:
      A。UserTransaction tx=new InitialContext().lookup("...");
         tx.commit();
      B. 使用hibernate封装的方法:(不推荐)
         Transaction tx=session.beginTransaction();
         tx.commit();
      C. 使用ejb之sessionBean的事务技持方法,你只要在把需要在发布描述符中,把需要jta事务的方法声明为require即可

21.悲观锁,乐观锁:
    乐观锁一般通过version来实现,注意version节点必须出现在id后。


22.Hibernate中,可以通过Criteria.setFirstResult和Criteria.setFetchSize方法设定分页范围。
    Query接口中也提供了与其一致的方法,hibernate主要在dialect类中实现在这个功能。


23.cache
    <hibernate-configuration>
<session-factory>
……
   <property name="hibernate.cache.provider_class">
    net.sf.ehcache.hibernate.Provider
   </property>

   还需对ecache本身进配置
   <ehcache>
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="10000" //Cache中最大允许保存的数据数量
eternal="false" //Cache中数据是否为常量
timeToIdleSeconds="120" //缓存数据钝化时间
timeToLiveSeconds="120" //缓存数据的生存时间
overflowToDisk="true" //内存不足时,是否启用磁盘缓存
/>
   </ehcache>

   之后在映射文件中指定各个映射实体的cache策略
   <class name=" org.hibernate.sample.TUser" .... >
<cache usage="read-write"/>
....
<set name="addresses" .... >
   <cache usage="read-only"/>
....
</set>
</class>

*****************************************************
Query.list()跟Query.iterate()的不同:
对于query.list()总是通过一条sql语句获取所有记录,然后将其读出,填入pojo返回;
但是query.iterate(),则是首先通过一条Select SQL 获取所有符合查询条件的记录的
id,再对这个id 集合进行循环操作,通过单独的Select SQL 取出每个id 所对应的记
录,之后填入POJO中返回。

也就是说,对于list 操作,需要一条SQL 完成。而对于iterate 操作,需要n+1
条SQL。,list方法将不会从Cache中读取数据。iterator却会。


24.ThreadLocal:它会为每个线程维护一个私有的变量空间。实际上,
其实现原理是在JVM 中维护一个Map,这个Map的key 就是当前的线程对象,而value则是
线程通过ThreadLocal.set方法保存的对象实例。当线程调用ThreadLocal.get方法时,
ThreadLocal会根据当前线程对象的引用,取出Map中对应的对象返回。

这样,ThreadLocal通过以各个线程对象的引用作为区分,从而将不同线程的变量隔离开
来。


25.Hibernate官方开发手册标准示例:
   public class HibernateUtil {
private static SessionFactory sessionFactory;
static {
try {
// Create the SessionFactory
sessionFactory = new
Configuration().configure().buildSessionFactory();
} catch (HibernateException ex) {
throw new RuntimeException(
"Configuration problem: " + ex.getMessage(),
ex
);
}
}
public static final ThreadLocal session = new ThreadLocal();
public static Session currentSession() throws HibernateException
{
Session s = (Session) session.get();
// Open a new Session, if this Thread has none yet
if (s == null) {
s = sessionFactory.openSession();
session.set(s);
}
return s;
}
public static void closeSession() throws HibernateException {
Session s = (Session) session.get();
session.set(null);
if (s != null)
s.close();
}
}


     
26.通过filter实现session的重用:
    public class PersistenceFilter implements Filter
{
protected static ThreadLocal hibernateHolder = new ThreadLocal();
public void doFilter(ServletRequest request, ServletResponse
response, FilterChain chain)
throws IOException, ServletException
{
hibernateHolder.set(getSession());
try
{
……
chain.doFilter(request, response);
……
}
finally
{
Session sess = (Session)hibernateHolder.get();
if (sess != null)
{
hibernateHolder.set(null);
try
{
sess.close();
}
catch (HibernateException ex) {
throw new ServletException(ex);
}
}
}
}
……}

27.Spring的参数化事务管理功能相当强大,笔者建议在基于Spring Framework的应用
开发中,尽量使用容器管理事务,以获得数据逻辑代码的最佳可读性。

public class UserDAO extends HibernateDaoSupport implements IUserDAO
{
public void insertUser(User user) {
getHibernateTemplate().saveOrUpdate(user);
}
}


   上面的UserDAO实现了自定义的IUserDAO接口,并扩展了抽象类:
HibernateDaoSupport
HibernateSupport实现了HibernateTemplate和SessionFactory实例的关联。
HibernateTemplate对Hibernate Session操作进行了封装,而
HibernateTemplate.execute方法则是一封装机制的核心

   *在spring的配置文件里,移植了整个hibernate.cfg.xml的内容


相关推荐

    hibernate要点

    ### Hibernate核心知识点详解 #### 一、什么是Hibernate? Hibernate是一个开放源码的**对象关系映射(ORM)框架**,它允许将Java对象映射到关系型数据库中的表,以及从数据库表映射到Java对象上。通过ORM,...

    hibernate配置要点详谈

    ### Hibernate配置要点详谈 #### 一、配置文件与配置方式 在Hibernate中,有两种主要的配置文件形式:`hibernate.cfg.xml` 和 `hibernate.properties`。 1. **`hibernate.cfg.xml`**: - 这种配置文件通常包含...

    struts2 spring hibernate整合要点、注意点

    ### Struts2、Spring与Hibernate整合的关键点及注意事项 #### 一、概述 在Java Web开发领域,Struts2、Spring以及Hibernate是三个非常重要的框架。它们分别在MVC架构、依赖注入与业务逻辑管理、对象关系映射等方面...

    hibernate和spring技术难点及其要点总结

    【标题】:“hibernate和spring技术难点及其要点总结” 【描述】:“hibernate和spring技术难点及其要点总结” 本文将深入探讨Hibernate和Spring框架在Java开发中的关键概念、应用场景以及技术难点。首先,我们来...

    Spring Hibernate 整合要点之JPA

    下面我们将详细讲解整合Spring、Hibernate与JPA的要点。 1. **依赖包** 在整合Spring和Hibernate的JPA之前,首先需要确保引入了正确的依赖包。这包括Spring的核心库、Hibernate的Core库以及JPA相关的库。如`spring...

    java之hibernate和spring技术难点及其要点总结

    ### Java之Hibernate和Spring技术难点及其要点总结 #### Hibernate与Spring技术概述 在Java开发领域,Hibernate和Spring作为两个非常重要的框架,对于提高应用程序的开发效率、降低维护成本具有不可替代的作用。...

    Hibernate学习要点_one2one 一对一主键双线关联

    在深入探讨Hibernate中的一对一(One-to-One)主键双线关联机制之前,我们首先需要理解几个核心概念:Hibernate框架、实体关系映射以及主键关联的基本原理。Hibernate是Java平台下的一款开源对象关系映射(ORM)框架...

    《MyEclipse 6 Java 开发中文教程》前10章

    7.2.2 Hibernate要点 106 7.3准备工作 112 7.4创建 HibernateDemo 项目 112 7.4.1创建表格 112 7.4.2创建 HibernateDemo Java Project 113 7.4.3添加 Hibernate Capabilities 到现有项目 114 7.4.4 使用Hibernate...

    Hibernate 与 Lucene 的整合框架详解

    #### 三、技术要点解析 ##### 1. Hibernate Search 的版本 文中提到的 Hibernate Search 版本为 3.0.0.GA。GA (General Availability) 表示该版本已经稳定可用,适合生产环境部署。这个版本支持 Hibernate ORM 3.x...

    hibernate_release_5.0.12.zip

    《Hibernate 5.0.12 全量包解析与技术要点详解》 Hibernate,作为Java领域中的一个著名持久化框架,一直以来都是开发者们进行对象关系映射(ORM)的重要工具。本文将针对"hibernate-release-5.0.12.zip"这一版本的...

    hibernate+spring复习大纲

    ### 复习要点 1. 理解Hibernate的实体生命周期,掌握CRUD操作。 2. 掌握HQL和Criteria查询,理解其与原生SQL的区别。 3. 学会编写和配置Spring的XML或Java配置,理解DI和AOP原理。 4. 熟悉Spring MVC的Controller、...

    Hibernate Recipes

    ### Hibernate Recipes:问题与解决方案概览 ...通过本书提供的丰富示例和深入讲解,读者可以快速掌握Hibernate的核心概念和技术要点,提升自己的开发技能。无论是初学者还是有一定经验的开发者,都能从中受益匪浅。

    hibernate映射文件配置分析及要点

    hibernate 映射文件 配置分析及要点,你还在为配置hibernate 映射文件而发愁吗?这里总结了它的常用元素及属性。session,SessionFactory的应用

    struts+hibernate web小项目

    **项目学习要点** 1. **Struts配置**:了解如何在struts.xml文件中配置Action、结果类型、拦截器等。 2. **Hibernate配置**:学习如何在hibernate.cfg.xml中配置数据库连接,以及在实体类上使用注解实现一对一关系...

    Hibernate 源代码及重要说明

    **三、源码学习要点** 1. **EntityScanner**: Hibernate源码中负责扫描项目中所有标注了@Entity的类,构建实体类的元数据。 2. **SessionFactoryBuilder**: 创建SessionFactory的过程,包括配置读取、数据库连接...

    Hibernate程序性能优化的考虑要点

    ### Hibernate程序性能优化的考虑要点 在开发基于Hibernate框架的应用时,性能优化是至关重要的环节。Hibernate作为一款优秀的对象关系映射(ORM)工具,它能够简化Java应用程序与数据库之间的交互,但不当的配置和...

    hibernate中文参考文档.pdf

    根据给定的文件信息“hibernate中文参考文档.pdf”,我们可以深入探讨Hibernate这一主题,它在Java开发领域中扮演着至关重要的角色。...掌握其核心概念和技术要点,对于Java开发者而言是不可或缺的技能。

    马士兵Hibernate文档

    这份文档旨在为学习者提供全面、详细的Hibernate框架的学习资料,帮助他们更好地理解和掌握Hibernate的相关概念和技术要点。下面将围绕这份文档可能涵盖的核心知识点进行详细阐述。 ### Hibernate概述 Hibernate是...

    struts+hibernate实现在线音乐系统源码

    Struts和Hibernate是Java开发中常用的两个开源框架,它们在构建Web应用程序时起着至关重要的作用。...通过研究这个项目,开发者不仅可以提升对Struts和Hibernate的理解,还能掌握在线音乐服务的开发流程和技术要点。

Global site tag (gtag.js) - Google Analytics