自动在数据库中创建表

配置.hbm.xml 文件:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="demo.test.autocreateDB">
    <class name="Student" table="student001">
        <id name="id" column="s_id">
            <generator class="native"/>
        </id>
        <property name="name" column="s_name"/>
    </class>
</hibernate-mapping>
<!-- 
    自动创建数据库:
    根据package找到对应的包名,再从包中找到对应的类.
    table:创建数据库的名字
    generator:设置主键,native:根据本地设置主键
    property : 列名
主键生成策略
 1,assigned(*):手动设置主键值
  如果不设置主键:ids for this class must be manually assigned before calling save()
 
 2,uuid:使用UUID来生成主键
   1,主键的类型必须是string;
   2,主键的值是hibernate框架帮我们生成的;
    优势:框架帮我们生成, 不重复
    劣势:没有顺序, 数据量稍大
 
 3,increment
   1,主键类型需要是数字(int, double, long...), 只要可以做算数的加法匀速那即可;
   2,首先查询出当前表最大的id,id+1再设置为当前对象的主键值;
   3,hibernate会把每一个类型的increment值缓存起来,提高性能;
  
 4,identity:使用数据库本身的自增主键生成方式;
   1,对于MYSQL来说,其实我们使用native的时候,就是使用了identity方式;
   2,要使用identity,必须要求数据库支持自增的方式
   3,有的数据库不支持(比如Oracle -> sequence), 有的支持(如:SQL SERVER)
     不支持数据库的迁移(换数据库, 但是同时把数据同步过去);
 
 5,native(*):native就是使用数据库支持的主键生成方式;
   对于MYSQL来说,使用identity;
   对于ORACLE来说,使用sequence;
  
 6,TableGenerator(*:org.hibernate.id.TableGenerator):
  使用一个额外的表(hibernate_sequences)来模拟序列生成器;
   1,如果没有其他配置,hibernate会使用一个叫做default的序列生成器为所有的对象生成主键;
   2,可以设置segment_value来为每一个对象单独创建一个序列生成器;
   3,默认情况下,每生成一个主键需要两个SQL,性能不高(1,select:获取当前id;2,update:更新next_val)
   4,性能提升,increment_size:设置一次可以取多少个值;
-->

将.hbm.xml配置到.cfg.xml中,同时写出创建表的语句

<!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>
    <!--
         连接数据库的四大参数:①驱动②数据库③账户④密码,注意:不能有空格 
    -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql:///test</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>
    <!-- 打印sql语句 测试 -->
        <property name="show_sql">true</property>
        <!-- 自动创建表的语句  -->
        <property name="hbm2ddl.auto">create</property>
    <!-- 
        引入映射文件,这是domain中绑定的employee.hbm.xml路径
     -->    
    <mapping resource="demo/test/autocreateDB/Student.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

创建对象模型:

package demo.test.autocreateDB;

public class Student {
    private long id;
    private String name;
    public Student() {}
    public Student(long id, String name) {
        this.id = id;
        this.name = name;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student [id=" + id + ", name=" + name + "]";
    }

}

创建测试类:

package demo.test.autocreateDB;

import org.hibernate.Session;
import org.junit.Test;

import demo.test.utiltool.UtilTool;

public class TestStudent {
    @Test
    public void TestSave() {
        //调用工具类的方法
        Session session = UtilTool.getInstance().getSession();
        session.beginTransaction();
        Student stu = new Student(1, "惠轲");
        session.save(stu);
        session.getTransaction().commit();
        session.close();
        //Hibernate: insert into student001 (s_name) values (?)
    }
}
原文地址:https://www.cnblogs.com/huike/p/6561607.html