1。面向设计的映射:
  使用组件(无id的实体类),把一些信息归类
 1<component name="contact" class="entiy.Contact">
 2          <property
 3            name="addr"
 4            type="string"
 5            column="addr"    
 6        />
 7        <property
 8            name="tel"
 9            type="string"
10            column="tel"    
11        />
12  
13        </component>
14


2。面向性能的映射: 
  在hibernate 3中使用延迟加载技术; 
  在hiberntae2中采用继承方法,把数据大的字段分派在子类中,父类只保留简单字段即可;同时,配置文件更改

 1<class
 2        name="parent"
 3        table="Tuser"
 4        optimistic-lock="version"
 5    >
 6
 7        <id
 8            name="id"
 9            column="id"
10            type="int"
11            unsaved-value="0"
12        >
13           <generator class="sequence">
14                <param name="sequence">TUSER_SEQ</param>
15            </generator>
16        </id>
17
18        <property
19            name="name"
20            type="string"
21            column="name"
22                    />
23        

 1<class
 2        name="children"
 3        table="Tuser"
 4        optimistic-lock="version"
 5        polymorphism="explicit"       //指名这个类是个多态,只有则指定类是才会查询,否则不会查询(如:from object),只会查询parent,只有(from children)才会查旬
 6    >
 7
 8        <id
 9            name="id"
10            column="id"
11            type="int"
12            unsaved-value="0"
13        >
14           <generator class="sequence">
15                <param name="sequence">TUSER_SEQ</param>
16            </generator>    
17        </id>
18
19        <property
20            name="name"
21            type="string" 
22            column="name"
23                   />
24
25
26           <property
27            name="blog"
28            type="blog" 
29            column="blog"
30                   />
31
32        


hibernate 加载机制:
1。延迟加载: 这个比较常用,即在用到关联数据时才进行查询。<lazy="true">
在hibernate2中默认为false,但在hibernate3中默认为ture,
因为这点我曾经有过一段常时间的困惑

1select tuser0_.id as id0_0_, tuser0_.name as name0_0_, tuser0_.addr as addr0_0_, tuser0_.tel as tel0_0_ from Tuser tuser0_ where tuser0_.id=?
 
当时用到延迟加载时,hibernate使用代理类动态的创建对象,真正的对象位于CGLIB$CALLBACK$TARGET对象中,我们获得的对象是一个CGLIB代理类,只有当真正用到数据时,代理类才会检查被代理对象是否存在,如存在,返回被代理对象数据,如不存在,则去进行hibernate查询


在集合属性查询时,如果使用了延迟加载,则当session关闭后,是无法得到集合属性的,我们可以通过Hibernate.initialize()强制加载集合对象


2.即时加载: 查询时同时做一次对关联数据的查询<lazy="false">

Hibernate: select tuser0_.id as id0_0_, tuser0_.name as name0_0_, tuser0_.addr as addr0_0_, tuser0_.tel as tel0_0_ from Tuser tuser0_ where tuser0_.id=?
Hibernate: select games0_.userid as userid1_, games0_.id as id1_, games0_.id as id1_0_, games0_.name as name1_0_, games0_.userid as userid1_0_ from Tgame games0_ where games0_.userid
=?


即时加载时,当调用session.load()时hibernate执行一次数据库查询,然后直接赋值给对象
3.预先加载:通过out jion 进行抓取,不适合一对多等查询


4。批量加载
在批量处理时,一级缓存会把所有处理数据对象纳入一级缓存,如过数据过多,则会导致内存益处。解决办法就是用批量提交的方法


<property name="hibernate.jdbc.batch_size">3</property>