主键生成采用uuid的方式生成,在实体类中该主键的类型必须为String类型。
hibernate xml配置文件的方式
实体类:Student.java:
package com.bxw.entity; public class Student { private String id; private String name; private String sex; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
配置文件Student.hbm.xml默认路径和Student类在同一个包。
<?xml version="1.0" encoding='UTF-8'?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.bxw.entity"> <class name="Student"> <id name="id"> <generator class="uuid"></generator> </id> <property name="name"></property> <property name="sex"></property> </class> </hibernate-mapping>
测试
package com.bxw.test; import org.hibernate.Session; import org.hibernate.cfg.Configuration; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import com.bxw.entity.Student; public class StudentTest{ private static Session session = null; @BeforeClass public static void getSession(){ try { Configuration conf = new Configuration(); conf.configure(); session = conf.buildSessionFactory().openSession(); } catch (Exception e) { e.printStackTrace(); } } @Test public void hibernateIdTest() { Student ss = new Student(); ss.setName("Han meimei"); ss.setSex("女"); session.beginTransaction(); session.save(ss); session.getTransaction().commit(); } @AfterClass public static void over(){ session.close(); } }
====================分割线=======================
注解方式生成主键:
package com.bxw.entity; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import org.hibernate.annotations.GenericGenerator; @Entity public class Teacher { private String id; private String title; private String sex; @Id @GenericGenerator(name="system-uuid",strategy="uuid") @GeneratedValue(generator="system-uuid") public String getId() { return id; } public void setId(String id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
=====================分割线======================
自定义主键生成方式:
创建自定义生成主键类(本文以时间“年月日时分秒”为格式生成):
package com.bxw.common; import java.io.Serializable; import java.text.SimpleDateFormat; import java.util.Date; import org.hibernate.HibernateException; import org.hibernate.engine.SessionImplementor; import org.hibernate.id.AbstractUUIDGenerator; public class KeyUUID extends AbstractUUIDGenerator{ public Serializable generate(SessionImplementor arg0, Object arg1) throws HibernateException { String dateStr = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); return dateStr; } }
需要采用此自定义主键生成方式的实体:
package com.bxw.entity; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import org.hibernate.annotations.GenericGenerator; @Entity public class Teacher { private String id; private String title; private String sex; @Id @GenericGenerator(name="custom-uuid",strategy="com.bxw.common.KeyUUID") @GeneratedValue(generator="custom-uuid") public String getId() { return id; } public void setId(String id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
=============分界线=============
sequence生成主键
package com.bxw.entity; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.SequenceGenerator; @Entity @SequenceGenerator(name="teacherSeq",sequenceName="teacherSeq") public class Teacher { private int id; private String title; private String sex; @Id @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="teacherSeq") public int getId() { return id; } public void setId(int id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
@SequenceGenerator(name="teacherSeq",sequenceName="teacherSeq")
name是该sequence在程序中的名字
sequenceName是该sequence在数据库中的名字
================分割线========================
实体类:
package com.bxw.entity; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.SequenceGenerator; import javax.persistence.TableGenerator; @Entity @TableGenerator( name = "Teacher_GEN", table = "GENERATOR_TABLE", pkColumnName = "pk_key",
valueColumnName = "pk_value" pkColumnValue = "teacher", allocationSize = 1 ) public class Teacher { private int id; private String title; private String sex; @Id @GeneratedValue(strategy=GenerationType.TABLE,generator="Teacher_GEN") public int getId() { return id; } public void setId(int id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
@TableGenerator(
name = "Teacher_GEN",
table = "GENERATOR_TABLE",
pkColumnName = "pk_key",
valueColumnName = "pk_value"
pkColumnValue = "teacher",
allocationSize = 1
)
生成一个主键生成器
name:该生成器的名字;
table:用来存储主键的表;
pkColumnName:第一个字段名;
valueColumnName:第二个字段名;
pkColumnValue:用来表示该条记录是哪个表的主键,是第一个字段的值,第二个字段用来储存主键。