Hibernate-3.6.8知识点(未完)

  对一特定的持久化l类, id 属性持有唯一的标识符(identifier)的值。如果我们希望使用 Hibernate 提供的所有特性,那么所有的持久化实体(persistent entity)类(这里也包括一些次要依赖类)都需要一个这样的标识符属性。然而,我们通常不会操作对象的标识(identity),因此它的 setter 方法的访问级别应该声明 private。这样当对象被保存的时候,只有 Hibernate 可以为它分配标识符值。你可看到Hibernate可以直接访问 public,private 和 protected 的访问方法和 field。

  所有的持久化类(persistent classes)都要求有无参的构造器,因为 Hibernate 必须使用 Java 反射机制来为你创建对象。构造器(constructor)的访问级别可以是 private,然而当生成运行时代理(runtime proxy)的时候则要求使用至少是 package 级别的访问控制,这样在没有字节码指令(bytecode instrumentation)的情况下,从持久化类里获取数据会更有效率。

  如果在映射文件中没有设置 type 属性的话,Hibernate 会自己试着去确定正确的转换类型和它的映射类型。在某些情况下这个自动检测机制(在 Java 类上使用反射机制)不会产生你所期待或需要的缺省值。date 属性就是个很好的例子。 当处理映射文件时,Hibernate 用反射(reflection)来决定这个映射类型。这需要时间和资源,所以如果你注重启动性能,你应该考虑显性地定义所用的类型。

  Hibernate 支持两个第三方的开源 JDBC 连接池:c3p0proxool

  hibernate.cfg.xml文件基本信息如下:

 1 <?xml version='1.0' encoding='utf-8'?>
2 <!DOCTYPE hibernate-configuration PUBLIC
3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
4 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
5
6 <hibernate-configuration>
7
8 <session-factory>
9
10 <!-- Database connection settings -->
11 <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
12 <property name="connection.url">jdbc:mysql://localhost:3306/learn</property>
13 <property name="connection.username">root</property>
14 <property name="connection.password">huyimei898</property>
15
16 <!-- JDBC connection pool (use the built-in) -->
17 <!-- <property name="connection.pool_size">1</property> -->
18
19 <!-- SQL dialect -->
20 <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
21
22 <!-- Enable Hibernate's automatic session context management -->
23 <property name="current_session_context_class">thread</property>
24
25 <!-- Disable the second-level cache -->
26 <!-- <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> -->
27
28 <!-- Echo all executed SQL to stdout -->
29 <property name="show_sql">true</property>
30
31 <!-- Drop and re-create the database schema on startup -->
32 <property name="hbm2ddl.auto">update</property>
33
34 <!-- <mapping resource="org/hibernate/tutorial/domain/Event.hbm.xml" /> -->
35 <mapping resource="com/learnhibernate/bean/user.hbm.xml"/>
36 <mapping resource="com/learnhibernate/bean/Event.hbm.xml" />
37
38 </session-factory>
39
40 </hibernate-configuration>


  在hibernate.cfg.xml中,我们配置了 Hibernate 的SessionFactory — 一个关联于特定数据库全局的工厂(factory)。如果你要使用多个数据库,就要用多个的 <session-factory>,通常把它们放在多个配置文件中(为了更容易启动)。

  Hibernate 提供三种跟踪当前会话的方法。基于“线程”的方法不适合于产品环境,它仅用于 prototyping 和教学用途。

  org.hibernate.Session 在第一次被使用的时候,即第一次调用 getCurrentSession() 的时候,其生命周期就开始。然后它被 Hibernate 绑定到当前线程。当事务结束的时候,不管是提交还是回滚,Hibernate 会自动把 org.hibernate.Session 从当前线程剥离,并且关闭它。假若你再次调用 getCurrentSession(),你会得到一个新的 org.hibernate.Session,并且开始一个新的工作单元。

  Hibernate org.hibernate.Session 是否被应该用来执行多次数据库操作?Hibernate org.hibernate.Session 的生命周期可以很灵活,但是你绝不要把你的应用程序设计成为每一次数据库操作都用一个新的 Hibernate org.hibernate.Session

  多对多关联,值类型的集合跟引用类型的集合有所不同。值集合用<element type="" column=""/>,而引用类型集合用<many-to-many column="" class=""/>。

  所有的双向关联需要有一端被设置为 inverse(<set>的属性)。在一对多关联中它必须是代表多(many)的那端。而在多对多(many-to-many)关联中,你可以任意选取一端,因为两端之间并没有差别。




 

 

posted @ 2012-03-05 14:12  我愿为蛹  阅读(367)  评论(0)    收藏  举报