首页 > WEB开发 > 后台开发 > Hibernate入门
2014
10-18

Hibernate入门

三、Hibernate基础配置

1、Hibernate配置文件

这些属性用来控制Hibernate在运行期的行为,它们都是可选的,并拥有适当的默认值,对应着hibernate.cfg.xml文件中的property元素。常见配置属性如下:

1)hibernate.dialect:数据库方言

指定一个org.hibernate.dialect.Dialect的实现类,该实现类允许 Hibernate 针对特定的关系数据库生成优化的SQL语句。具体查文档。

2)hibernate.show_sql、hibernate.format_sql:显示/格式化SQL

相当于开发模式开关,开发中建议置为true。

3)hbm2ddl.auto:自动建表

配置该属性后,Hibernate可以根据映射文件或Annotation自动创建表(生成DDL语句)。不同的值对应不同建表策略:

  • update:常用,推荐。如果映射文件(或Annotation)发生了改变,则更新数据表。
  • create:每次加载配置文件时(即创建SessionFactory)都会重新创建数据表。
  • create-drop:创建SessionFactory时创建创建table,显示关闭时删除table。
  • validate:每次创建SessionFactory时,会根据映射文件对table进行验证。

2、Hibernate注解(映射时用)

本文推荐使用注解方式配置类到表的映射,XML方式的配置有些麻烦。

1)@Entity/@Id、@Table/@Column、@Transient

见2.2节Annotation版本的helloworld中。

2)日期时间类型的映射:@Temporal

java.util.Date类型的属性映射到数据表中的类型默认为DateTime,即日期时间。

如果在表中只想记录日期,在日期属性的getter方法上加@Temporal(TemporalType.DATE),只记录时间加上@Temporal(TemporalType.TIME)。差不多99%的情况下都是保持默认。

3)枚举类型的映射:@Enumerated

枚举类型属性映射到数据表中可以用两种类型表示:字符串、数字(序号),对应着:@Enumerated(EnumType.STRING)、@Enumerated(EnumType.ORDINAL),加在枚举类型的属性上即可。

3、Id生成策略

1)XML方式:generator

<id name="id" column="id">
	<generator class="increment"></generator>
</id>

常用四个:native(最常用) identity sequence uuid

当指定为native时,表明Id生成策略和使用的数据库有关,在MySql中使用auto_increment,Oracle中使用sequence,SqlServer中使用identity。

2)Annotation方式:@GeneratedValue

@Id
@GeneratedValue
public Integer getId() {
	return id;
}

查阅@GeneratedValue的源码(JPA的Api,可在Java EE源码中找到),如下:

public interface GeneratedValue {
	public abstract GenerationType strategy();
	public abstract String generator();
}

strategy属性指定了Id的生成策略,是一个枚举类型,取值有:AUTO、SEQUENCE、IDENTITY等,如果不指定strategy默认为AUTO,相当于xml方式中的native。

4、Hibernate的日志环境

Hibernate的日志使用slf4j API,slf不是具体的日志解决方案,它只服务于各种各样的日志系统(类似于日志规范),在Hibernate的required目录下可以找到slf的API包。

slf可以使用各种各样的实现,如slf自己提供的实现slf4j-nop,还可以使用log4j(slf4j-log4j12)、commons-logging(slf4j-jcl)、JDK logging(slf4j-jdk14)等等,使用时需拷贝相应的jar包,很多系统中都是使用log4j日志系统。如下图所示:

06. Hibernate入门7374

SLF4J有点类似于JDBC、JPA,提供了一套API(规范),对应着不同厂家的实现。

5、先建类还是先建表

可以通过配置hbm2ddl.auto属性从类直接生成表,也可以通过MyEclipse中的反向工程生成类。

1)理论上应该先建类后再生成表:面向对象编程。

2)但是实际开发中都是先建表再生成类:实际中建好数据库表后,一般需要对表做一些优化,如建立索引、视图、中间表等,如果用Hibernate自动生成这些表,这些优化是没办法自动完成的。建完表后使用MyEclipse反向工程就可以直接生成相应的持久化类及DAO。

四、Hibernate开发接口及三种对象状态

1、Hibernate开发接口

1)Configuration

① 进行配置信息的管理,默认加载classpath下的hibernate.cfg.xml。
Configuration configuration = new Configuration().configure();

② buildSessionFactory

用来产生SessionFactory:SessionFactory factory = configuration.buildSessionFactory();

2)SessionFactory

用来产生session,两种方法(重点):openSession和getCurrentSession

  • openSession:每次都是产生新的session。需要显式close
  • getCurrentSession:从上下文找session,如果有返回旧的,没有才产生。这种方式产生的session在commit后自动关闭。

(☆)session的上下文有两种:thread和jta,在hibernate.cfg.xml中配置:

<property name="current_session_context_class">thread</property>

如果使用thread,管事务的时候用的是connection的事务,也即单独的一个数据库连接的事务;如果使用jta,管事务的时候是用的是application Server提供的事务管理器,常见于分布式的事务处理上(不是分布式也能用,没必要而已)。

3)Session(☆)

session管理对数据库的增删改查。在2.1节中已经演示了Session的save、update、createQuery、get及delete方法。

① 重点:load和get的区别

  • load:load返回的是代理对象,并没有真正的发出sql语句。sql语句是在后面使用该对象时才发出的。(延迟初始化)
  • get:直接从数据库加载,不会延迟。

② update

当修改了一个对象的某个字段并更新时,会更新对应记录的所有字段。如何只更新修改部分的字段:

  • 设置映射文件class元素的dynamic-update属性为true。
  • 不使用update方法,而是使用HQL语句进行更新。

③ clear

无论是load还是get,都会首先查找Session缓存(一级缓存),如果没找到,才会去数据库中查找。clear方法可以强制清除Session缓存。

④ flush:强制进行从Session缓存到数据库的同步。

4)Query

Query query = session.createQuery(hql);

在使用HQL语句时需要用到Query,有点类似于JDBC中的Statement,可以写select语句,也可以写update语句。

2、三种对象状态

06. Hibernate入门8875

对象的三种状态的区分关键(☆):

对象有没有ID、数据库中有没有该ID、在Session缓存中有没有该ID

  • transient:没ID
  • persistent:有ID,且数据库和session缓存中都有该ID。
  • detached:有ID,数据库中有,session缓存中没有该ID。

留下一个回复

你的email不会被公开。