Hibernate主键生成策略

主键常用类型

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();
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值