标识符属性生成策略与对象识别
标识符属性
标识符属性的生成策略
Increment生成策略
Identity生成策略
Sequence生成策略
Hilo生成策略
Seqhilo生成策略
Uuid生成策略
Guid生成策略
Native生成策略
Assigned生成策略
Foreign生成策略`
id值(自动生成序列)
本章要点
如何映射复合主键
使用属性映射复合主键
使用主键类映射复合主键
Hibernate中的持久化对象的识别
Commons lang builder的使用
标识符属性,也可以称为Hibernate主键
标识符属性赋予每个持久化对象独一无二的数值以此区分不同的持久化对象
标识符属性的生成策略
在Hibernate的映射文件(*。hbm.xml)中,<id>元素定义了持久化类的标识符性的名称、类型和与数据库表中字段的映射
<id>元素的<generator>子元素则来设置当前持久化类的标识符属性的策略
在Hibetnate中,内置了多种标识符属性生成策略
org.hibernate.id.IdentifierGenerator接口中。
Increment生成策略:
从数据库表中获取当前主键字段的最大值,然后在最大值基础上加1,作为当前持久化对象的标识符属性值:
<id name=”id” type=”java.lang.Integer” column=”ID”>
<generator class=”increment”> <-------sequence
</generator>
</id>
increment(所有数据库)
identify生成策略
MS SQL Server 、MySQL和DB2等数据库中,都可以设置表中某一个字段的数据值自动增长,而identity生成策略就是通过使用这种方式,为当前的记录获取主键值的同时为持久化对象赋予标识符属性值。
<id name=”id” type=”java.lang.Integer” column=”ID”>
<generator class=”identity”>
</generator>
</id>
sequence生成策略:
在Oracle 、DB2和PostgreSQL等数据库中创建一个序列(sequence),然后Hibernate通过序列为当前的记录获取主键值,进而为持久化对象赋予标识符属性值
<id name=”id” type=”java.lang.Integer” column=”ID”>
<generator class=”sequence”>
<param name=”sequence”>gb_seq</param>
</generator>
</id>
hilo生成策略
hilo生成策略采用一种称为高/低位(hi/lo)的高效算法,产生的标识符属性值为long、short、int以及他们封装的类型
<id name=”id” type=”java.lang.Integer” column=”ID”>
<generator class=”hilo”>
<param name=”table”>hibernate_key</param>
<param name=”column”>next_hivalue</param>
</generator>
</id>
seqhilo生成策略
seqhilo生成策略使用的还是高低位算法,产生的标识符属性值为long、shor/int以及他们封装的类型.与hilo生成策略不同和是,它使用指定的sequence获取高低位值。
<id name=”id” type=”java.lang.Integer” column=”ID”>
<generator class=”seqhilo”>
<param name=”sequence”>hibernate_seq</param>
</generator>
</id>
uuid生成策略:
uudi生成策略采用128的uuid算法来生成一个字符类型的主键值,这个算法使用IP地址、JVM启动时间(精确到1/4),系统时间和和一个计数器值(在当前 jvm中唯一)经过计算来产生标识符属性值,可以用于分布式的Hibernate应用中。
<id name=”id” type=”java.lang.String” column=”ID”>
<generator class=”uuid”>
</generator>
<id>
guid生成策略
这种标识符属性生成策略,借助MS SQL Server 或者MySQL数据库中的GUID字符产生标识符属性值。
<id name=”id ” type=”java.lang.String” column=”id”>
<generator clas=”guid”>
</generator>
</id>
native生成策略
让Hibernate自己根据所使用的数据库热支持能力,从identity、sequence或者hilo生成第一成策略中选择一种标识符属性生成方式
<id name=”id ” type=”java.lang.Integer” column=”ID”>
<generator class=”native”>
</generator>
<id>
assigned生成策略
使用assigned生成策略表示由Hibernate应用自主指定标识符
属性的数值,也就是说,在调用Session对象的save()方法持久化对象时,需要先对持久化对象的标识符属性赋值。
<id name=”id ” type=”java.lang.Integer” column=”ID”>
<generator class=”assigned”>
</generator>
<id>
foreign生成策略
foreign 生成策略通过所关联的持久化对象,为当前持久化对象设置标识符属性值。
<id name=”id” type=”java.lang.Integer” column=”ID” >
<generator class=”foreign”>
<param name=”property”>user</param>
</generator>
</id>
使用主键类映射复合主键
使用这种方式映射复合主键,持久化类需要使用一个单独的主键类对象复合主键进行映射,主键类中的属性就是与映射复合主键字段的属性。
使用属性映射复合主键
除了一述这些标识符生成策略之外,我们还可以根据当前的需求。让持久化类的标识符属性映射数据库表的复合主键。(javabene中创建一个构造方法 有复合中所有的属性(列名))等配置。
Oralce中不能有表名为user的表,因为在Oralce中user是一个关键字
public class HibernateTest{
public static void main(String [] args){
SessionFactory sf = HibernateSessionFactory.getSessionFactory();
Session session = sf.getCurrentSession();
SimpleDateFormat sdf = new SimpleDateFormat(“dd-mm-yyyy”);
Date birthdayte=null;
try{
birthdayte = sdf.parse(“04-12-1584”);
}catch(ParsetException e ){
e.printStackTrace();
}
User user = new User(“flf” , new Date());
user.setEmail(“flfna@163.com”);
user.serPassword(“55555”);
session.beginTranscation();
session.save(user);
session.getTransaction().commit();
}
}
public class HibernateTest{
public static void main(String[] args){
SimpleDateFormat sdf = new SimpleDateFormat(“dd-mm-yyyy”);
new HibetnateTest().add();
}
public void add() throws ParseException{
SimpleDateFormat sdf = new SimpleDateFormat(yyyy-mm-dd);
Date birthDate = sdf.parse(“1456-11-05”);
UserId uid = new UserId (birthDate,”flf”);
User u = new User();
u.setId(uid);
u.setEmail(“flfna@163.com”);
u.setPassword(“fweo”);
Session session = HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
session.save();
session.getTransaction().commit();
}
}
Commons lang builder的使用
总是有重写从Object类所继承的equals()、hashCode()和toString()等方法的需求
Apache Commons Lang组件builder包中的帮助类可以助我们一臂之力。
下载:net.sf.commonclipse.jar 并放到MyEclipse 的plugin中
Commons lang builder 的使用
common-lang-2.4.jar(apache 中的)