其实在做项目中,首先要做的就是建立数据库和每张表的关系。今天老师让我们尝试不去手动建立数据库,使用hibernate映射pojo类建立齐相应的数据库,也很简单,只需要在hibernate.cfg.xml中加一段配置<property name="hbm2ddl.auto"></property>其中 属性值有三个:
update:当数据库不存在表时,hibernate启动后会自动生成表结构。
当数据库表存在时,如果一样,则只会写入数据,不会改变表结构。
当数据库表存在时,如果不一样,则会修改表结构,原有的表结构不会改变。
create:无论表结构是否存在,hibernate启动后都会重新生成表结构。(造成之前的数据丢失)
create-drop:无论表结构是否存在,hibernate启动都会重新生成表结构。并且hibernate关闭后,表结构会被删除。来无影去无踪。
validate:不会创建表结构,不会修改表结构。校验与数据库中的表结构是否一样,如果不一样则报异常。以上是我在网上找到的,所以一般用update,毕竟update考虑的情况较多,风险性少。create有风险,使用需谨慎。同表名就会覆盖数据,剩下两个使用的就很少了。
接下来我贴hibernate.cfg.xml的代码
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <!-- Generated by MyEclipse Hibernate Tools. --> <hibernate-configuration> <session-factory> <property name="hbm2ddl.auto">update</property> <property name="dialect"> org.hibernate.dialect.MySQLDialect </property> <property name="connection.url"> jdbc:mysql://localhost:3306/person </property> <property name="connection.username">root</property> <property name="connection.password">root</property> <property name="connection.driver_class"> com.mysql.jdbc.Driver </property> <property name="myeclipse.connection.profile"> com.mysql.jdbc.Driver </property> <property name="show_sql">true</property> <mapping resource="com/hust/Fubo/Person.hbm.xml" /> </session-factory> </hibernate-configuration>
首先我的person数据库中是没有表的,然后我们试着插如一条数据:
package com.hust.Fubo; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.junit.Test; public class Dongruan { @Test public void selectStu(){ Configuration cig = new Configuration().configure(); SessionFactory sessionFactory = cig.buildSessionFactory(); Session session = sessionFactory.openSession(); Transaction t = session.beginTransaction(); Person p = new Person(); p.setName("shi"); p.setSex("man"); session.save(p); t.commit(); session.close(); sessionFactory.close(); } }
hibernate自动的根据我们pojo类名创建了一个person的表。我们再试试已存在同名表再去插入数据。将setName("shi");改成setName("tiger");
再次运行
他会继续插入数据而不改变表,id等于2、3 的是我瞎运行了两次然后删除行了,问题不大。