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,
因为这点我曾经有过一段常时间的困惑
1
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使用代理类动态的创建对象,真正的对象位于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>