2 u010787774 u010787774 于 2015.07.07 10:00 提问

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方法也没有关系,目前推测数据来源:一是存在数据缓存,二是存在某种异常处理手段。

6个回答

u012216727
u012216727   Ds   Rxr 2015.07.07 10:04

update
你这里是否应该用update啊

u012216727
u012216727   Ds   Rxr 2015.07.07 10:06

你在配置hibernate是不是应该指定更新方式为update

u010787774
u010787774   2015.07.07 10:15

create,update,drop我尝试过了,现在问题是我修改后,数据库当中会出现两份数据,一份是我修改后的,一份是我修改前的,我现在无法理解修改的数据保存在哪里,我已经尝试清空了tomcat缓存,重新编译了myecplise项目,重启了电脑,都没有用。

u010787774
u010787774   2015.07.07 10:59

问题解决了,是tomcat-work下面的缓存信息没有删除,只删除了webapps下面的。

yuke198907
yuke198907   2015.07.07 12:52

你执行的方法是什么方法,有可能是你想更新的数据变成了insert新增的数据了

u010258525
u010258525   2015.07.07 16:54

修改成create-or-extend会不会好

Csdn user default icon
上传中...
上传图片
插入图片