Hibernate--id生成策略

http://www.hibernate.org/

一、定义

id生成策略:hibernate根据数据库设置帮你生成id

二、各种配置

基于XML配置

<idname="id"type="java.lang.Integer">

<columnname="ID"precision="8"scale="0"/>

<generatorclass="native"/>

</id>

常见的generator:

increment:用于long、short、int类型唯一标识,只有在没有其他进程往同一张表中插入数据时才能使用,在集群下不能使用

identity:采用数据库提供的主键生成机制。如DB2、SQLServer、MySQL中的主键生成机制。

sequence:采用数据库提供的sequence机制生成主键。如Oralce中的Sequence。

native:由Hibernate根据使用的数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式。跨数据库平台!

hilo:通过hi/lo算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源

uuid.string:与uuid.hex类似,只是生成的主键未进行编码(长度16),不能应用在PostgreSQL数据库中。(要求主键是String类型)

基于Anootation

指定seq的名称!

@Entity

@Table(name="Teacher")

@SequenceGenerator(name="teacher_SEQ",sequencename="seq_teacher")

publicclassTeacher{

@Id

@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="teacher_SEQ")

publicintgetId(){

returnid;

}

联合主键....

二、核心接口

3Configuration

a)AnnotationConfiguration

b)进行配置信息的管理

c)用来产生SessionFactory

d)可以在configure方法中指定hibernate配置文件

e)只需关注一个方法即:buildSessionFactory

4SessoinFactory

a)用来产生和管理Session

b)通常情况下每个应用只需要一个SessionFactory

c)除非要访间多个数据库的情况

d)关注两个方法即:openSessiongetCurrentsession

i.opensession每次都是新的,需要close

ii.getCurrentsession从上下文找,如果有,用旧的,如果没有,建新的

1.用途,界定事务边界

2.事务提交自动close

3.上下文配置可参见xml文件中

<propertyname="current_session_context_classs">thread</property>

4.current_session_context_class(jta、thread常用managed、custom.Class少用)

a)thread使用connection但数据库连接管理事务

b)jta(全称javatransactionapi)-java分布式事务管理(多数据库访问)

jta由中间件提供(jbossWebLogic等,tomcat不支持)

5Session

a)管理一个数据库的任务单元(简单说就是增删改查)

b)方法(CRUD)

i.Save()

ii.delete

iii.load

iv.get

v.get与load的区别

1.不存在对应记录时表现不一样

2.load返回的是代理对象,等到真正用到对象的内容时才发出sql语句

3.get直接从数据库加载,不会延迟

vi.updates

1.用来更新detached对象,更新完成后转为persistent状态

2.更新transient对象会报错

3.更新自己设定id的transient对象可以(数据库有对应记录)

4.persistent状态的对象只要设定(如:t.setName…)不同字段就会发生更新

5.更新部分更改的字段

a)xml设定property标签的update属性,annotation设定@Column的updatable

属性,不过这种方式很少用,因为不灵活

b)使用xml中的dynamic-update,JPA1.0Annotation没有对应的属性,hibernate扩

展?

i.同一个session可以,跨session不行,不过可以用merge()(不重要)

c)使用HQL(EjBQL)(建议)

vii.saveOrUpdate()

viii.clear方法

1.无论是load还是get,都会首先査找缓存(一级缓存),如果没有,才会去数据库査找,调用

clear()方法可以强制清除session缓存

ix.flush()方法

1.当session的事务提交后,会强制将内存(session缓存)与数据库同步.默认情况下是session的事务提交(commit)时才同步!

2.session的FlushMode设置,可以设定在什么时候同步缓存与数据库(很少用)

例如:session.setFlushMode(FlushMode.AUTO)

x.find方法已经过时!

6SchemaExport(自动建表)

相关推荐