大小写不敏感
持久化类一般被定义为JavaBean,这是推荐的设计,但是并不是必须的。Hibernate也可以直接访问这些field。
所有的持久化类(persistent classes)都要求有无参的构造器,因为Hibernate必须使用Java反射机制来为你创建对象。
映射文件
一个映射文件看起来像这样
<hibernate-mapping>
<class name="events.Event" table="EVENTS">
<id name="id" column="EVENT_ID">
<generator class="native"/>
</id>
<property name="date" type="timestamp" column="EVENT_DATE"/>
<property name="title"/>
</class>
</hibernate-mapping>
class元素代表要持久化的类以及它对应的数据表(一般情况下一个类对应一个表)
id元素中的name属性代表持久化类的标识符,而column则代表对应表中的主键。除此之外我们还要用generrator属性定义标识符的生成策略。
property属性用于映射持久化类的字段。有时候你需要手工指定转换成为的数据库数据类型以及数据表
Hibernate配置
配置Hibernate的工作就是配置hibernate.properties或者hibernate.cfg.xml
hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">org.hsqldb.jdbcDriver</property>
<property name="connection.url">jdbc:hsqldb:hsql://localhost</property>
<property name="connection.username">sa</property>
<property name="connection.password"></property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.HSQLDialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">create</property>
<mapping resource="events/Event.hbm.xml"/>
</session-factory>
</hibernate-configuration>
在这里,我们配置了Hibernate的SessionFactory-一个关联于特定数据库全局的工厂(factory)。如果你要使用多个数据库,就要用多个的<session-factory>,通常把它们放在多个配置文件中(为了更容易启动)。
用Ant来构建程序
build.xml
<project name="hibernate-tutorial" default="compile">
<property name="sourcedir" value="${basedir}/src"/>
<property name="targetdir" value="${basedir}/bin"/>
<property name="librarydir" value="${basedir}/lib"/>
<path id="libraries">
<fileset dir="${librarydir}">
<include name="*.jar"/>
</fileset>
</path>
<target name="clean">
<delete dir="${targetdir}"/>
<mkdir dir="${targetdir}"/>
</target>
<target name="compile" depends="clean, copy-resources">
<javac srcdir="${sourcedir}"
destdir="${targetdir}"
classpathref="libraries"/>
</target>
<target name="copy-resources">
<copy todir="${targetdir}">
<fileset dir="${sourcedir}">
<exclude name="**/*.java"/>
</fileset>
</copy>
</target>
</project>
启动和辅助类
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.getCurrentSession()
映射
理解对象标识符
映射组合
细粒度对象模型
Hibernate项目的主要目标之一就是支持细粒度模型,
实体类型和值类型Entity and value type
实体类型:一个实体类型对象拥有它自己的数据库标识符(primary key值),一个被实体引用的对象以一个引用的方式持久化在一个数据库中(a foreign key value)。一个实体拥有它自己的生命周期;它相对于其他实体独立存在。
值类型:一个值类型对象没有数据库标识符;它属于一个实体,并且它的持久化状态是嵌入到属主实体的数据表行中(除了集合类型以外,)值类型没有标识符或者标识符参数。值类型实例的生命周期绑定在它的属主实体上。
建立关系数据库模型的一个重要原则是在不会导致数据冗余的前提下,尽可能减少数据库表的数目及表之间的外键参照关系。
映射组合关系就是指多个类对应一个表的映射。如Address、Customer类对应CUSTOMER表。
主要通过<component>元素来完成的。
映射继承关系
数据表之间并不存在继承关系,如何映射类间的继承关系呢?有三种方法:
1.每一个具体类对应一个表table-per-concrete-class
2.整个继承层次对应一个表table-per-class-hierarchy
<hibernate-mapping>