java - 在休眠的上下文中将@NotNull 属性添加到现有域模型的便捷模式更新策略是什么?
问题描述
我目前在 Spring Boot 和 Hibernate 的帮助下开发了一个小型 Java 应用程序。随着我的应用程序的发展,领域模型也在发展。上次我面临我的域模型的频繁更新 - 新列被添加到现有表中。这个新的列添加不是手动发生的,而是通过配置hibernate.ddl-auto=update
的属性自动发生的,只要我在我的实体类中引入新的类变量(字段)。
当我在引入新字段的同时添加新注释时,问题就会出现@NotNull
,这并不奇怪:如果没有进一步的操作,旧表条目在新列中可能没有有效数据,因此整个更新可能会导致损坏数据库如果成功。特别是这样,如果hibernate首先更新表(通过@NotNull
对列设置约束),然后发现该列中有很多数据是无效的(null
)。由于hibernate.ddl-auto=update
损坏的列无法通过简单的回滚来恢复@NotNull
新引入字段的属性(即,如果我将此注释注释掉并再次启动应用程序)。这就是为什么在这种情况下我被迫删除带有损坏数据的整个表的原因,这绝对不是正确做事的方法,尤其是在开发环境之外。
因此我的问题是:有没有办法更新现有的域模型,这样约束@NotNull
不会在新创建的字段上引入这样的问题?这种模式更新的最佳实践是什么,特别是如果我想避免手动更新整个数据库模式并希望进一步依赖休眠模式创建?
解决方案
如果要为所有行设置默认值,可以使用 @ColumnDefault 注释设置默认值
如果这不符合您的要求,您可能刚刚发现了根本不依赖模式更新程序用于生产目的的最佳实践的原因之一,请参阅官方休眠文档 - 26. 性能调优和最佳实践
推荐阅读
- kubernetes - Redis pod 未调度到 Kubernetes 中的特定节点
- c# - ASP.NET MVC SignalR 会意外刷新每个打开的页面
- excel - excel公式中的VBA引号
- c# - 如何使用 c#.net 程序获取 chrome 的配置文件路径
- php - 在 codeigneter 上的 SELECT 上未定义的变量错误有没有更好的方法来做到这一点?
- symfony - Docker mercure 不使用 symfony 发送更新
- r - predict.rpart 和 predict.glm 之间的输出差异
- r - 如何使用“for循环”在R中每次获取几个索引?
- python - CKAN-Datapusher HTTP500 错误由于“错误 -
: QueuePool 大小 5 溢出 10 已达到,连接超时“out” - linux-device-driver - 设置没有 pinctrl 名称的设备树节点时,GPIO 不受控制