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

    第一步:引入jar包 省略

    第二部:创建实体类

    package cn.hibernate.bean;

    public class Student {

    private Integer sId;
    private String sName;
    public Integer getsId() {
    return sId;
    }
    public void setsId(Integer sId) {
    this.sId = sId;
    }
    public String getsName() {
    return sName;
    }
    public void setsName(String sName) {
    this.sName = sName;
    }
    public Student(Integer sId, String sName) {
    super();
    this.sId = sId;
    this.sName = sName;
    }
    public Student() {
    super();
    }
    @Override
    public String toString() {
    return "Student [sId=" + sId + ", sName=" + sName + "]";
    }

    }

    第三步:创建映射文件 Student.hbm.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="cn.hibernate.bean">
    <class name="Student">
    <id name="sId">
    <!--
    主键生成策略
    * 整形 :int/short/long
    1.increment:hiernate自动维护表中的主键,先进行查询max(id),然后最大值+1,执行insert语句
    存在并发问题,不建议使用
    2.identity,hibernate采用数据库底层的自动正常。例如:mysql ## auto_increment修饰主键
    数据库的表结构中存在“AUTO——increment=5”进行记录
    3.sequence,hibernate采用数据库底层的序列。例如:oracle
    oracle:不支持自动增强,但支持序列
    4.hilo,hibernate将采用高低位算法(high/low)适用于不知此自动增长和序列的数据(了解即可)
    思想:采用另一张表记录累加数据
    <generator class="hilo">
    <param name="table">hi_value</param> hi_value 另一张表的表明
    <param name="column">next_value</param> next_value 另一张表的字段名
    <param name="max_lo">100</param> 一次操作支持的最大操作并发数。
    </generator>
    批量第一个值:max_lo * next_value + next_value
    100 6 + 6
    5.native:从identity、sequence、hilo 三选一,根据数据库决定
    ###以上的类型都是整形
    6.UUID,类型必须字符串
    以上策略:hibernate自动生成:代理主键
    7.assigned:自然主键,程序自己设置。
    -->
    <generator class="assigned">
    </generator>
    </id>
    <property name="sName"></property>
    </class>
    </hibernate-mapping>

    第四步:创建hibernate.cfg.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
    <session-factory>
    <!-- #1 基本的四项
    property.name 取值如果以‘hibernate’开头,可以省略
    以“hibernate.connection.driver_class”与“connection.driver_class”相同
    -->
    <property name="hibernate.connection.driver_class">
    com.mysql.jdbc.Driver
    </property>
    <property name="hibernate.connection.url">
    jdbc:mysql://localhost:3306/minemysql
    </property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">root</property>

    <!-- #2方言 -->
    <property name="hibernate.dialect">
    org.hibernate.dialect.MySQLDialect
    </property>


    <!-- #3 sql -->
    <!-- 是否显示sql语句 -->
    <property name="hibernate.show_sql">true</property>
    <!-- 是否格式化sql语句 不格式化显示一行 格式化显示多行 -->
    <property name="hibernate.format_sql">true</property>
    <!-- 是否显示注释,提供当前sql语句操作对象 -->
    <property name="hibernate.use_sql_comments">true</property>


    <!-- #4如何创建表(不重要)
    create:每一次加载cfg.xml文件都将创建表,程序关闭时,表不进行删除 [初始化,测试时使用]
    如果表存在则先删除后创建
    create-drop:每一次加载cfg.xml文件都将创建表,程序关闭时,表进行删除
    必须执行factory.close()才能删除
    update:如果表不存在则创建,如果表存在,先回检查*.hbm.xml文件是否和表匹配,
    如果不匹配将更新表结构(只添加,不删除)
    validate:加载cfg.xml进效验,映射文件和数据表是否匹配,如果匹配正常操作,如果不匹配则抛出异常
    ### 显示的开发中先有的表,再有的映射文件
    * 表 由DBA创建
    -->
    <property name="hibernate.hbm2ddl.auto">update</property>


    <!-- #5取消bean效验 -->
    <property name="javax.persistence.validation.mode">none</property>
    </session-factory>
    </hibernate-configuration>

    第五步:创建测试类

    package cn.hibernate.test;

    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    import org.junit.Test;

    import cn.hibernate.bean.Student;

    public class TestStu {

    private SessionFactory factory = new Configuration().configure().addClass(Student.class).buildSessionFactory();

    @Test
    public void demo01(){
    /*
    * 测试主键生成策略中的 increment
    * */

    Session session = factory.openSession();
    session.beginTransaction();

    Student stu = new Student();
    stu.setsName("哈哈");
    session.save(stu);
    session.getTransaction().commit();
    session.close();

    //执行的语句
    /*Hibernate:
    select
    max(sId)
    from
    Student
    Hibernate:
    insert cn.hibernate.bean.Student
    insert
    into
    Student
    (sName, sId)
    values
    (?, ?)*/



    }


    @Test
    public void demo02(){
    /*
    * 测试主键生成策略中的 identity
    * */

    Session session = factory.openSession();
    session.beginTransaction();

    Student stu = new Student();
    stu.setsName("哈哈1");
    session.save(stu);
    session.getTransaction().commit();
    session.close();

    //执行的语句
    /*Hibernate:
    insert cn.hibernate.bean.Student
    insert
    into
    Student
    (sName)
    values
    (?)
    */



    }


    @Test
    public void demo03(){
    /*
    * 测试主键生成策略中的 hilo
    * */

    Session session = factory.openSession();
    session.beginTransaction();

    Student stu = new Student();
    stu.setsName("哈哈12");
    session.save(stu);

    Student stu1 = new Student();
    stu.setsName("哈哈13");
    session.save(stu1);

    Student stu2 = new Student();
    stu.setsName("哈哈14");
    session.save(stu2);

    session.getTransaction().commit();
    session.close();

    }

    @Test
    public void demo04(){
    /*
    * 测试主键生成策略中的 UUID
    * */

    Session session = factory.openSession();
    session.beginTransaction();

    Student stu = new Student();
    stu.setsName("333");
    session.save(stu);

    Student stu1 = new Student();
    stu.setsName("222");
    session.save(stu1);

    Student stu2 = new Student();
    stu.setsName("111");
    session.save(stu2);

    session.getTransaction().commit();
    session.close();

    }

    @Test
    public void demo05(){
    /*
    * 测试主键生成策略中的 assigned
    * */

    Session session = factory.openSession();
    session.beginTransaction();

    Student stu = new Student();
    stu.setsId("104322-19910423-ww");
    stu.setsName("333");
    session.save(stu);

    session.getTransaction().commit();
    session.close();

    }

    }

  • 相关阅读:
     Go is more about software engineering than programming language research.
    perl 处理json 数组格式
    perl 处理json 数组格式
    mongodb 限制ip访问
    mongodb 限制ip访问
    haproxy 访问www.zjdev.com 自动跳转到appserver_8001 对应的nginx
    haproxy 访问www.zjdev.com 自动跳转到appserver_8001 对应的nginx
    docker 数据盘映射方案
    docker 数据盘映射方案
    perl encode_utf8 和decode_utf8
  • 原文地址:https://www.cnblogs.com/MisterLiu/p/6937443.html
Copyright © 2011-2022 走看看