Hibernate通过实体类与hbm创建表
Hibernate通过实体类与hbm.xml创建表
开始尝试了很多次,都没能成功创建表,问题在于
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
or
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
生成的语句不同(见6)
老版本的MySQL使用TYPE而不是ENGINE(例如,TYPE = MYISAM)。MySQL 5.1为向下兼容而支持这个语法,但TYPE现在被轻视,而ENGINE是首先的用法。
MySQLDialect ->“type=MyISAM”
MySQL5Dialect->“engine=MyISAM”
-
项目结构
-
创建实体类
Student.java
public class Student implements Serializable { private int id; private String name; private int age; ...//getter setter }
-
创建映射
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> <class name="learn.hibernate.entity.Student" table="stu_tab" > <id name="id" column="stu_id"> <generator class="native"/> </id> <property name="name" column="stu_name"/> <property name="age" column="stu_age"/> </class> </hibernate-mapping>
-
配置
hibernate.cfg.xml
<hibernate-configuration> <session-factory> <!--配置数据库连接--> <property name="connection.url">jdbc:mysql://localhost:3306/test</property> <property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property> <property name="connection.username">root</property> <property name="connection.password">123</property> <!--显示sql语句--> <property name="show_sql">true</property> <property name="format_sql">true</property> <!--设置映射--> <mapping resource="learn/hibernate/entity/Student.hbm.xml"/> <!-- DB schema will be updated if needed --> <!-- <property name="hbm2ddl.auto">update</property> --> </session-factory> </hibernate-configuration>
-
测试类
StudentTest.java
public class StudentTest { //测试在数据库中根据Student类以及Student.hbm.xml创建表 @Test public void createTable(){ ServiceRegistry sr = new StandardServiceRegistryBuilder().configure().build(); Metadata md=new MetadataSources(sr).buildMetadata(); SchemaExport se=new SchemaExport(); se.create(EnumSet.of(TargetType.DATABASE), md); } }
-
控制台输出
-
MySQL5Dialect
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
可以成功创建表,语句如下
Hibernate: drop table if exists stu_tab Hibernate: create table stu_tab ( stu_id integer not null auto_increment, stu_name varchar(255), stu_age integer, primary key (stu_id) ) engine=MyISAM
-
MySQLDialect
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
无法创建,语句如下
Hibernate: drop table if exists stu_tab Hibernate: create table stu_tab ( stu_id integer not null auto_increment, stu_name varchar(255), stu_age integer, primary key (stu_id) ) type=MyISAM
-