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>