最近团队又启动了好早前发布的一个古老项目,框架组成:springmvc+hibernate+jsp。看了下之前自己写的代码,百般嫌弃,琢磨了半天需求,唯一感想 - 重构,=_=|| 果然由俭入奢易,由奢(springboot前后端分离)入俭(springmvc+jsp)难啊~~
问题描述
因需求变化,DB中某个表的某个字段需要加大size,于是愉快的修改了表结构也整理好了更新sql,结果部署到开发环境后,前端大佬提醒API报错了!
问题回溯
Hibernate有自动创建和更新表的操作,于是看了下表对应的实体类,上面有写声明varchar(64)
,这就是表结构被变更的原因!
import javax.persistence.Column;
@Column(name = "user_name", columnDefinition = "varchar(64) COMMENT '用户姓名'")
解决方案
hibernate.hbm2ddl.auto设置为none
关闭Hibernate自动更新,将属性值hibernate.hbm2ddl.auto设置为none
相关知识点
Hibernate xml方式相关配置
springmvc中hibernate配置可使用map或者properties两种方式,区别不大:
- <property name=“jpaPropertyMap”>
- <property name=“jpaProperties”>
以下是jpaProperties方式:
<!-- Jpa Entity Manager 配置 关联hibernateJpaVendorAdapter -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<!-- 数据源bean -->
<property name="dataSource" ref="dataSource"/>
<!-- 指定JPA属性;如Hibernate中指定是否显示SQL的是否显示、方言等 -->
<property name="jpaProperties">
<props>
<!-- <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop> -->
<prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
<!-- <prop key="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</prop> -->
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<!-- <prop key="hibernate.hbm2ddl.auto">validate</prop> -->
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
hbm2ddl.auto 属性
属性值 | 说明 |
---|---|
validate | 加载hibernate时,验证创建数据库表结构 |
create | 每次加载hibernate,重新创建数据库表结构 |
create-drop | 加载hibernate时创建,退出是删除表结构 |
update | 加载hibernate自动更新数据库结构 |
none | 不做任何操作 |
总结
对于hbm2ddl.auto
一般情况下,项目是需要数据库脚本版本管理,所以建议使用none!
若项目不需要脚本管理,可以使用 validate / update。
create / create-drop 操作杀伤性太大,最好不要使用,不然删库跑路那是家常便饭。