问题描述
- Hibernate+Spring整合后自动建表问题
-
我测试了一个项目,初期没有问题,但是当我修改了自动生成的数据信息后发现,重新部署后数据仍然为原来的信息,接着我尝试了修改表名,重新部署后表名也和原来一样。
以下是配置信息:
Hibernate:<property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="jdbc.batch_size">20</property> <property name="hbm2ddl.auto">${hibernate.auto}</property> <property name="connection.autocommit">true</property> <!-- 显示sql语句 --> <property name="show_sql">true</property> <property name="format_sql">false</property> <property name="connection.useUnicode">true</property> <property name="connection.characterEncoding">UTF-8</property> <!-- 缓存设置 --> <property name="cache.provider_configuration_file_resource_path">classpath:hibernate-ehcache.xml</property> <property name="hibernate.cache.region.factory_class">org.hibernate.cache.SingletonEhCacheRegionFactory</property> <property name="hibernate.cache.use_query_cache">false</property> </session-factory> spring: <!-- 数据库连接池c3p0配置 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="jdbcUrl" value="${db.url}"></property> <property name="properties" ref="dataSourceProperties"/> <property name="driverClass" value="${db.driver}"></property> <property name="maxPoolSize" value="40"></property> <property name="minPoolSize" value="10"></property> <property name="initialPoolSize" value="10"></property> <property name="maxIdleTime" value="60"></property> <property name="idleConnectionTestPeriod" value="360" /> <property name="preferredTestQuery" value="select 1" /> <property name="acquireIncrement" value="5" /> <property name="acquireRetryAttempts" value="50" /> <property name="acquireRetryDelay" value="1000" /> <property name="breakAfterAcquireFailure" value="true" /> <property name="autoCommitOnClose" value="false" /> <property name="testConnectionOnCheckout" value="true" /> <property name="maxStatements" value="100" /> <property name="maxStatementsPerConnection" value="5" /> </bean> <!-- session工厂 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource" /> </property> <property name="configLocation" value="classpath:hibernate.cfg.xml"/> <property name="annotatedClasses"> <list> <value>com.gdms.model.rbac.Department</value> <value>com.gdms.model.rbac.Role</value> <value>com.gdms.model.rbac.Permission</value> <value>com.gdms.model.rbac.User</value> </list> </property> <!-- xml自动扫描方式配置的hibernate类文件 --> <property name="mappingLocations"> <value>classpath:com/gdms/model/*.hbm.xml</value> </property> </bean> 我自己做的几次测试
BUG信息:hibernate自动建表信息与配置文件和hbm配置信息不一致。
使用配置文件无法控制hibernate自动建表,而且无法找到hibernate自动建表的表名来源。测试过程中要十分注意缓存问题
测试1:首先测试数据库连接是否还有用。
测试方法:修改数据库连接信息密码,使密码错误。
测试结果:测试显示配置文件仍然能够使用,并且配置数据库信息测试2:不使用Hibernate自动建表
测试方法:将hibernate.atuo修改为None
测试结果:即使hibernate.atuo修改为None,仍然进行了自动建表。目前结论,可以确定目前出现的bug与hibernate.atuo没有关联,因为部队Hibernate.auto设置任何信息,hibernate仍然会完成自动建表。
测试3:查看Init方法是否对建表数据产生影响
测试方法:修改数据
测试结果:修改数据没有用,数据仍然产生为以前数据。测试4:查看修改信息是否对数据库中数据是否产生影响
测试方法:修改初始化方法的数据
测试结果:没有任务影响目前结论:可以确定目前的建表与Hibernate没有关系,与项目中的init方法也没有关系,目前推测数据来源:一是存在数据缓存,二是存在某种异常处理手段。
解决方案
update
你这里是否应该用update啊
解决方案二:
你在配置hibernate是不是应该指定更新方式为update
解决方案三:
create,update,drop我尝试过了,现在问题是我修改后,数据库当中会出现两份数据,一份是我修改后的,一份是我修改前的,我现在无法理解修改的数据保存在哪里,我已经尝试清空了tomcat缓存,重新编译了myecplise项目,重启了电脑,都没有用。
解决方案四:
问题解决了,是tomcat-work下面的缓存信息没有删除,只删除了webapps下面的。
解决方案五:
你执行的方法是什么方法,有可能是你想更新的数据变成了insert新增的数据了
解决方案六:
修改成create-or-extend会不会好