主键常用类型
assigned:
<generator class="assigned" />
主键由外部程序负责生成,在save()之前必须指定一个。
Hibernate不负责维护主键生成。与Hibernate和底层数据库都无关,可以跨数据库。
在存储对象前,必须要使用主键的setter的方法给主键赋值,至于这个值怎么生成,完全由自己决定,这种方法一个尽量避免。
identity:
<generator class="identity" />
dentity由底层数据库生成标识符。
identity是由数据库自己生成的,但这个主键必须设置为自增长。
使用identity的前提条件是底层数据库支持自动增长字段类型,如DB2、SQL Servlet、MySQL、Sybase和HypersonicSQL等,
Oracle这类数据库没有自增字段的则不支持。
sequence:
<generator class="sequence" />
采用数据库提供的sequence机制生成主键,需要数据库支持sequence。
如Oracle、DB、SAP DB、PostgerSQL、McKoi中的sequence。
MySQL这种不支持sequence的数据库则不行(可以使用identity)。
increment:
<generator class="increment" />
由Hibernate从数据库中取出主键的最大值(每个session只取1次),以该值为基础。
每次增量为1,在内存中生成主键,不依赖于底层的数据库,因此可以跨数据库。
native:
<generator class="native" />
由Hibernate根据使用的数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式,灵活性很强。
如果能支持identity则使用identity,如果支持sequence则使用sequence。
uuid:
<generator class="uuid" />
是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。
按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字,标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx(8-4-4-4-12)
其中每个x是0-9或a-f范围内的一个十六进制的数字。
guid:
<generator class="guid" />
也称作UUID,是一个128位长的数字,用16进制表示。
算法的核心思想是结合机器的网卡、当地时间、一个随机数来生成GUID。
从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义上)3240年不重复。
自定义主键生成器
<generator class="类的全路径限定名"/>
<hibernate-mapping>
<class name="com.zking.entity.MyTest" table="test">
<id name="tid" type="java.lang.String">
<column name="TID" />
<generator class="com.zking.generator.Generator" />
</id>
<property name="tname" type="java.lang.String">
<column name="TNAME" />
</property>
</class>
</hibernate-mapping>
创建主键生成器类 实现org.hibernate.id.IdentifierGenerator接口
读取数据库信息实现自定义主键生成器
public class Generator implements IdentifierGenerator {
MyTest mytest = null;
@Override
public Serializable generate(SharedSessionContractImplementor session, Object object) throws HibernateException {
find();
return mytest.getTid() + 1;
}
@Test
public void find() {
Configuration configuration = new Configuration().configure();
SessionFactory sessionfactory = configuration.buildSessionFactory();
Session session = sessionfactory.openSession();
Transaction transaction = session.beginTransaction();
mytest = session.find(MyTest.class, "2011");
transaction.commit();
session.close();
sessionfactory.close();
}
}