zoukankan      html  css  js  c++  java
  • hibernate主键生成策略

    主键生成采用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:用来表示该条记录是哪个表的主键,是第一个字段的值,第二个字段用来储存主键。
  • 相关阅读:
    java获取src下包的文件的路径
    Java获取日期属于当年第几周
    DIV的内容自动换行
    js验证身份证格式
    处理 WebService 中的 Map 对象
    Oracle使用row_number()函数查询时增加序号列
    SpingMVC实现集合参数(Could not instantiate bean class [java.util.List])
    利用JS实现在li中添加或删除class属性
    栈的应用之中缀表达式转后缀表达式
    栈的应用之判断括号匹配
  • 原文地址:https://www.cnblogs.com/popcornya/p/7215393.html
Copyright © 2011-2022 走看看