自动建表的配置建完表后,最好关掉配置<property name="hibernate.hbm2ddl.auto">create</property>每次都重新建表,如果表已经存在就先删除再创建。<property name="hibernate.hbm2ddl.auto">create-drop</property>每次在创建sessionFactory时执行创建表当调用sessionFactory的close方法的时候,再删除。<property name="hibernate.hbm2ddl.auto">update</property>如果不存在就创建;存在就不创建。<property name="hibernate.hbm2ddl.auto">validate</property>执行验证,当映射文件与表结构不一样,报错 通过代码自动建表,执行代码后会根据class.hbm.xml文件中的内容自动建表
package com.cx.hello; import org.hibernate.cfg.Configuration; import org.hibernate.tool.hbm2ddl.SchemaExport; import org.junit.Test; /** * Created by cxspace on 16-7-23. */ public class App_ddl { //自动建表 @Test public void testCreate() throws Exception{ //创建配置管理对象 Configuration config = new Configuration(); //加载主配置文件 config.configure(); //创建工具类对象 SchemaExport export = new SchemaExport(config); //建表,这两个参数一个在控制台显示脚本,一个执行脚本 export.create(true,true); } }
对象映射配置文件详解
<?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"> <!-- 映射文件作用,映射一个实体类对象,描述一个对象最终实现可以直接保存对象数据到数据库 --> <!-- package 要映射的对象所在的包 (可选)如果不指定,下面的所有的类都需要指定全路径 auto-import 默认为true,在写hql的时候自动导入 包名,如果指定为false,再写hql的时候要写上类的全名 如: session.createQuery("from cn.cxspace.Employee").list(); --> <hibernate-mapping package="com.cx.hello" > <!-- class 映射某一个对象的(一般情况,一个对象写一个映射文件,小写一个class节点) name 指定要映射的对象类型 table 对象对应的表(如果没有指定表名,默认和对象名一样) --> <class name="Employee" table="employee"> <!--对象与表,字段与属性--> <!--主键,映射--> <id name="empId" column="id"> <!-- 主键的生成策略 identity 自增长 (mysql , db2) native 自增长 [会根据数据库自增长的方式选择identity或sequence] 如果是mysql数据库,那么使用identity实现自增长 如果是oracle,那么使用sequence实现自增长 sequence 自增长(序列),oracle中自增长是以序列方式实现的 increment 自增长(会有并发问题,一般在服务器集群环境使用会存在并发问题) assigned 指定主键生成策略为手动指定主键的值 uuid 指定uuid随机生成的惟一的值 foreign (外键方式) --> <generator class="native"/> </id> <!--非主键,映射--> <!-- 普通字段映射 property name 指定对象的属性名称 column 指定对象属性对象表的字段名称,如果不写默认与对象的属性一致。 (列名为关键字,需要加单引号或者改列名) length 指定字符类型的长度,默认为255 type 指定表字段的类型 java类型 : 必须写类全名 hibernate类型 : 直接写类型,都是小写 --> <property name="empName" column="empName" length="20"></property> <property name="workDate" column="workDate" ></property> </class> </hibernate-mapping>
关于主键的一些问题
一个表能否有多个主键 ? 不能
为什么要设置主键 ? 数据库存储的数据都是有效的,必须保持唯一。
为什么把id作为主键 ? id保证了记录的唯一性。
联合主键
[如果找不到合适的列作为主键,除了用id列已外,一般用联合主键,即多列的值作为一个主键,从而保证记录的唯一性]
复合主键的表建立(t1,t1联合主键) CREATE TABLE t( t1 int, t2 int, msg VARCHAR(20), PRIMARY KEY(t1 , t2) );
时间: 2024-10-12 09:50:02