首页 > 解决方案 > 在休眠的上下文中将@NotNull 属性添加到现有域模型的便捷模式更新策略是什么?

问题描述

我目前在 Spring Boot 和 Hibernate 的帮助下开发了一个小型 Java 应用程序。随着我的应用程序的发展,领域模型也在发展。上次我面临我的域模型的频繁更新 - 新列被添加到现有表中。这个新的列添加不是手动发生的,而是通过配置hibernate.ddl-auto=update的属性自动发生的,只要我在我的实体类中引入新的类变量(字段)。

当我在引入新字段的同时添加新注释时,问题就会出现@NotNull,这并不奇怪:如果没有进一步的操作,旧表条目在新列中可能没有有效数据,因此整个更新可能会导致损坏数据库如果成功。特别是这样,如果hibernate首先更新表(通过@NotNull对列设置约束),然后发现该列中有很多数据是无效的(null)。由于hibernate.ddl-auto=update损坏的列无法通过简单的回滚来恢复@NotNull新引入字段的属性(即,如果我将此注释注释掉并再次启动应用程序)。这就是为什么在这种情况下我被迫删除带有损坏数据的整个表的原因,这绝对不是正确做事的方法,尤其是在开发环境之外。

因此我的问题是:有没有办法更新现有的域模型,这样约束@NotNull不会在新创建的字段上引入这样的问题?这种模式更新的最佳实践是什么,特别是如果我想避免手动更新整个数据库模式并希望进一步依赖休眠模式创建?

标签: javahibernatespring-boot

解决方案


如果要为所有行设置默认值,可以使用 @ColumnDefault 注释设置默认值

如果这不符合您的要求,您可能刚刚发现了根本不依赖模式更新程序用于生产目的的最佳实践的原因之一,请参阅官方休眠文档 - 26. 性能调优和最佳实践


推荐阅读