gpt4 book ai didi

java - 装箱实体字段后强制 JPA 删除 NOT NULL 标志

转载 作者:行者123 更新时间:2023-12-01 12:31:37 28 4
gpt4 key购买 nike

我将 Hibernate 与 Java 结合使用,在某些时候我有以下实体(简化):

@Entity
public class A {
private int value;
};

我有这个类很长时间了,当然,一些行被添加到数据库中。但是,很快,我将 int 更改为 Integer(以支持该列上的 nullable)。
现在,它看起来如下:

@Entity
public class A {
private Integer value;
};

当 JPA 为 Integer 创建列时,它会使列可为 null,但是当为 int 创建列时,该列具有属性 非空。这对于 Java 中的所有装箱类型都是一样的。

但是,当我运行应用程序时,JPA 不会从数据库中已定义的表架构中删除 NOT NULL 标志。我知道我可以手动删除它,但是不幸的是,我描述了非常简化的示例,并且在现实生活中我有很多具有类似属性的类似类。

那么,如何强制 JPA 正确更新架构并且不丢失已创建的数据?

最佳答案

问题:更改架构定义具有潜在危险,这可能就是 JPA 不支持更改现有列的原因。例如,如果列宽小于现有列宽,则可能会导致数据丢失。另外,在部署时更改大表可能意味着实际上需要很长时间的等待,直到数据发生更改(想象一下,如果在 20 个表上进行更改,每个表有 100 万个条目,您需要等待多长时间)。

解决方案:您必须手动执行此操作。我所做的就是在我的源代码控制系统中保留一个 .sql 文件(或每个较大的已发布功能),其中包含我所做的所有数据库更改,以便我知道在生产中必须更改什么/何时更改数据库。

关于java - 装箱实体字段后强制 JPA 删除 NOT NULL 标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25886620/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com