随笔 - 832  文章 - 2  评论 - 31  阅读 - 167万

用属性控制Hibernate生成DDL

Hiberate可以根据我们定义的@Entity实体类,来自动生成表结构,在一定程度上,你不需要与SQL打交道。在Spring Boot配合Hibernate使用的时候,可以定义属性来控制这种行为。如图所示:

 

 

  • create表示每次应用启动的时候,都会将之前的表全部drop掉,重新根据实体类生成一遍。
  • create-drop在create的基础上,在应用关闭的时候还会drop一次。
  • update可能是比较常用的,每次启动的时候会看看实体类有什么变化,然后看需不需要更改表结构。
  • validate不会对表进行更改,但是会看看他和实体类是否对应
  • none什么都不做

除了这个属性之外,Spring Boot还有另外一个属性:

 

 

都是生成ddl相关的,他俩有啥区别呢?我翻阅了好多源码和文档,得出了结论:spring.jpa.generate-ddl是更高层次上的抽象,他和具体的JPA实现无关,spring.jpa.hibernate.ddl-auto是和Hibernate相关的更具体的设置。前者会影响到后者,最好不要两者混用,容易混淆。在实践中,直接用后者就行。

如果你非得使用spring.jpa.generate-ddl,或者你看到别人用了他,那么你需要搞清楚:他的默认值是false,如果你显式设置为true,最后框架会选择update方式(从HibernateJpaVendorAdapter的源码可以看出)。

如果两个属性都没有配置,那么系统会判断你使用的是不是内置数据库(hsqldb, h2, derby),如果是的话会选用create-drop策略,其他情况是none策略。

好用么?

说实话,不堪重用。我将spring.jpa.hibernate.ddl-auto设置为update,同时把实体类的某个@Column属性删除了,按理说,我重新启动下应用,对应的字段应该被删除才对,但事实上,并没有。这就坑了,当需要精细地控制表结构的时候,你会感觉使不上力。

所以,在生产环境,还是不要用本文介绍的特性为好,选择更直接地方式去控制表结构。比如使用Flyway或者Liquibase来管理,因为你可以手写DDL相关的SQL语句,或者你们有DBA的话,交给他来处理。

posted on   小破孩楼主  阅读(527)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
历史上的今天:
2018-08-24 oracle左连接与右连接
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示