hibernate主键的生成


hibernte主键生成的必要条件: generator元素,表示了一个主键生成器,它用来为持久化类实例生成唯一的标识 。这个元素里面有个class属性主要作用是控制主键生成器的生成方式。
在这里插入图片描述
首先我先编写一个Demo来增加主键,这里我用两个实体类来测试,一个ID是Int类型的,另一个是String类型的。

/**
	 * 添加学生
	 * @param stu
	 * @return
	 */
	public Serializable addStudent(Student stu) {
		//获得操作数据库对象
		Session session = SessionFactoryUtils.openSession();
		Transaction transaction = session.beginTransaction();
		Serializable saveId = session.save(stu);
		
		transaction.commit();
		session.close();
		return saveId;
	}
	
	/**
	 * 添加工人
	 * @param work
	 * @return
	 */
	public Serializable addWorker(Worker work) {
		Session session = SessionFactoryUtils.openSession();
		Transaction transaction = session.beginTransaction();
		Serializable saveId = session.save(work);
		
		transaction.commit();
		session.close();
		return saveId;
	}

下面介绍几种属性的特点和缺点:

1 程序员自己控制:assigned

这种方式是自己赋值主键ID,通过自己编写代码赋值。当我这样输出时,

	public static void main(String[] args) {
		DemoDao dd = new DemoDao();
		Student stu = new Student();
		stu.setSid(4);
		stu.setSname("大宝2");
		System.out.println(dd.addStudent(stu));
	}

控制台:
在这里插入图片描述
这里要注意的是,如果你并不设置ID那会报错,即使数据库自动增长也是无用的。
如果你设置的ID在数据库中存在,那也会报错。

2 数据库控制: identity(标识列/自动增长) sequence

identity这种方式如果在数据库中你并没有自动增长的话则报错。所以这个ID也必须是数字类型的。

sequence 则走的是内置的一个序列,他会在数据库中自动生成一个表,生成的表的表名是由generator元素里的一个标签决定的,这个属性也是数字类型的,这个表里面放的是关于hibernate所有表的最大ID。关于hibernate的所有表都是采用这里面的ID来增长的。
在这里插入图片描述

3 hibernate控制:increment uuid/uuid.hex

increment 他是在增加的时候先查找数据库中这个表的最大ID然后+1,再来赋值,前提是ID必须是数字类型的。
在这里插入图片描述

uuid,是自动生成一个32位的随机16进制ID,然后赋值进去。这个要求是数据类型要是varchar的。因为16进制中有字母的存在。

4 native

native 则 等于identity+sequence。

5自定义主键生成器

其实在generator元素中class的每一个属性都是一个类,
所以想要自定义一个主键生成器,只需创建一个class文件然后实现实现org.hibernate.id.IdentifierGenerator接口即可,并还可以实现org.hibernate.id.Configurable接口来读取一些配置信息
PersistentIdentifierGenerator.TABLE
PersistentIdentifierGenerator.PK
然后重写generate()方法:
返回值随你而定。这里我返回的是系统当前时间,

	@Override
	public Serializable generate(SharedSessionContractImplementor arg0, Object arg1) throws HibernateException {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		return "zlk_shop_book_"+sdf.format(new Date());
	}

再然后在你想要应用的实体类XML里配置即可。

<generator class="com.zlk.two.id.Myts" />

这样他的ID就是根据你自己的意愿来增加啦。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值