问题描述
如题,刚学hibernate 不是很明白这个参数到底什么作用,网上查资料说是会改变表结构。可是我写小例子,却是会报错。例子就不放上来了,大概是:实体类和Hibernate Mapping XML文件比数据库中多了一列,然后hibernate.cfg.xml配置文件中hbm2ddl.auto的值为update但是运行后却会报错,报错代码大概是:Exception in thread "main" org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch updateat org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90)at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266)at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167)at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1028)at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:366)at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)at test.StudentTest.main(StudentTest.java:35)Caused by: java.sql.BatchUpdateException: Unknown column 'title' in 'field list'at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1093)at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:851)at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)... 8 more刚刚做了另外一个值的测试,发现create-drop也不像文档上描述的那样:执行完成后会删除。我执行完了之后发现数据库里刚建的表,并没有被删除。 问题补充:kyelxy 写道
解决方案
Hibernate hbm2ddl.auto,这个标签是用来基于你配置好了实体间的关系,然后可以自动生成表的。软件的设计可以分两个方向,一时面向数据库的设计,而是面向流程的设计。而hiberante是面向流程的设计,你把对象关系都配完了之后,也就表示表结构出来了。有些是先创建表,在创建流程。具体的Hibernate hbm2ddl.auto=“update”,第一次执行,会自动的根据关联关系,创建表。当第二次的时候,判断实体间的关系变了没有,或者参数变了没有,如果变了就更行表结构,如果没有就不管。还有其他的一些值,create-drop,是创建之后删除等操作。建议加上<prop key="hibernate.show_sql">true</prop>,这样可以查看一下执行sql