创建持久化的Java类
1.必须创建一个无参的构造器。可以使用Constructor.newInstance()来持久化类。
- 提供一个标识属性(identifier property)通常映射为数据库表的主键字段。如果没有这个属性,一些功能将不起作用。如Session.saveOrUpdate()。
- 为类的持久化字段提供访问方法(get/set),Hibernate对Java bean风格的属性实行持久化。
- 使用非final类。在运行时生成代理是Hibernate的一个重要的功能,如果持久化类没有实现任何借口,Hibernate使用CGLIB生成代理。如果使用final,将无法生成CGLIB代理。
- 重写equals和hashCode方法。如果要把持久化的类放到Set中(当需要进行关联映射时),则应该重写这两个方法。
Hibernate不要求持久化类继承任何父类或者实现接口,这样可以保证代码不被污染。这就是Hibernate被称为低侵入式设计的原因。
详解对象关系映射文件
Hibernate采用XML文件来指定对象和数据库之间关系的映射。在运行时Hibernate将根据这个映射文件生成各种SQL语句。Hibernate映射文件指定一些基本的配置信息。Hibernate将根据方言生成一些数据库特定的SQL语句。
映射的扩展名为.hbm.xml。
<hibernate-mapping>
<class name="com.hibernate.helloworld.HelloWorld" table="helloworld" schema="public" catalog="hibernate">
<id name="id">
<column name="id" sql-type="integer"/>
<generator class="native"/>
</id>
<property name="title">
<column name="title" sql-type="text" not-null="true"/>
</property>
<property name="author">
<column name="author" sql-type="text" not-null="true"/>
</property>
<property name="date">
<column name="date" sql-type="date" not-null="true"/>
</property>
</class>
</hibernate-mapping>
重要参数解释:
<generator class="native"/>
指定主键的生成方式。native使用数据库底层的生成方式。
<column name=""/>
对应数据库中的列名。
<property name="hibernate.hbm2ddl.auto">update</property>
指定运行时生成数据表的策略。
<mapping resource="com/hibernate/helloworld/HelloworldEntity.hbm.xml"/>
指定程序需要关联的映射文件。
通过Hibernate API访问数据库
Configuration类负责关联Hibernate配置信息。包括如下内容:
Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类、Dialect、数据库连接池等。对应hibernate.cfg.xml。
持久化类与数据库表的映射关系(*.hbm.xml文件)
创建Configuration的两种方式
- 属性文件(hibernate.properties)
Configuration cfg = new Configuration();
- Xml文件(hibernate.cfg.xml)
Configuration cfg = new Configuration().configure();
Configuration的configure方法还支持带参数的访问
File file = new File("simple.xml");
Configuration cfg = new Configuration().configure(file );
SessionFactory接口
针对单个数据库映射关系经过编译后的内存镜像,是线程安全的。
SessionFactory对象一旦创建完毕,即被赋予特定的配置信息。SessionFactory是生成Session的工厂。
构造SessionFactory很消耗资源。一般情况下一个应用只创建一个SessionFactory对象。
Hibernate4新增了一个ServiceRegistry接口,所以基于Hibernate的配置或者服务必须统一向这个ServiceRegistry注册后才能生效。
SessionFactory sessionFactory = null;
ServiceRegistry serviceRegistry =
new ServiceRegistryBuilder().applySettings(Configuration.getProperties()).buildServiceRegistry();
sessionFactory = configuration.buildSessionFactory(serviceRegistry );
Session接口
Session是应用程序与数据库之间交互操作的一个单线程对象。是Hibernate运作的中心。所有的持久化对象必须在session的管理下才可以进行持久化操作。此对象的生命周期很短。Session对象有一个一级缓存。显式执行flush之前,所有持久层操作的数据都缓存在session对象处。相当于JDBC的Connection。
持久化的类与Session关联起来后就具有了持久化的功能。
Session类的方法
Transaction事务
代表一次原子操作。所有持久化层必须在事务下运行,即使是只读操作。
Transaction tx = session.beginTransaction();
常用方法:
Hibernate配置文件的两个配置项
hbm2ddl.auto:该属性可以帮助程序员实现正向工程。即由Java代码生成数据库脚本。进而生成具体的表结构。取值有create|update|create-drop|validate。
- create:会根据*.hbm.xml生成数据表,但是每次运行都会删除上一次生成的表,重新生成表,哪怕两次没有任何改变。
- create-drop:会根据*.hbm.xml生成数据表,但是SessionFactory一关闭,表就自动删除。
- update:最常用的属性值。也不错会根据.hbm.xml生成数据表,但若.hbm.xml文件和数据库中对应的数据表结构不同,Hibernate将更新数据表的结构,但不会删除已有的行和列。
- validate:会和数据库中的表进行比较。若*.hbm.xml文件中的列在数据表中不存在,则抛出异常。
format_sql:是否将SQL转化为格式良好的SQL,取值为true|false。