Hibernate--id生成策略

http://www.hibernate.org/

一、定义
id生成策略:hibernate根据数据库设置帮你生成id

二、各种配置
基于XML配置
<id name="id" type="java.lang.Integer">
            <column name="ID" precision="8" scale="0" />
            <generator class="native" />
  </id>

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

identity:采用数据库提供的主键生成机制。如DB2、SQL   Server、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")
public class Teacher {

@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="teacher_SEQ")
public int getId() {
return id;
}

联合主键....

二、核心接口
3 Configuration
a) AnnotationConfiguration
b) 进行配置信息的管理
c) 用来产生SessionFactory
d) 可以在configure方法中指定hibernate配置文件
e) 只需关注一个方法即:buildSessionFactory
4 SessoinFactory
a) 用来产生和管理Session
b) 通常情况下每个应用只需要一个SessionFactory
c) 除非要访间多个数据库的情况
d) 关注两个方法即:openSession getCurrentsession
i. open session每次都是新的,需要close
ii. getCurrentsession从上下文找,如果有,用旧的,如果没有,建新的
1. 用途,界定事务边界
2. 事务提交自动close
3. 上下文配置可参见xml文件中
    <property name="current_session_context_classs">thread</property>
4. current_session_context_class (jta、thread常用 managed、custom.Class少用)
a) thread 使用connection 但数据库连接管理事务
b)jta (全称java transaction api)-java分布式事务管理(多数据库访问)
jta由中间件提供(jboss WebLogic等,tomcat不支持)
5 Session
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.0 Annotation 没有对应的属性,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方法已经过时!
6 SchemaExport (自动建表)

猜你喜欢

转载自xdjava.iteye.com/blog/1109206