文章目录
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就是根据你自己的意愿来增加啦。