Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在装箱实体字段后,强制JPA删除NOTNULL标志_Java_Sql_Hibernate_Jpa - Fatal编程技术网

Java 在装箱实体字段后,强制JPA删除NOTNULL标志

Java 在装箱实体字段后,强制JPA删除NOTNULL标志,java,sql,hibernate,jpa,Java,Sql,Hibernate,Jpa,我将Hibernate与Java结合使用,在某种程度上我拥有以下实体(简化): 我上这个课很长时间了,当然,一些行被添加到了数据库中。 但是,很快,我将int改为Integer(以支持该列上的nullable)。 现在,它看起来如下所示: @Entity public class A { private Integer value; }; 当JPA为整数创建列时,它使列可为空,但当为int创建列时,该列具有属性非空。Java中的所有装箱类型都是一样的 但是,当我运行我的应用程序时,JP

我将Hibernate与Java结合使用,在某种程度上我拥有以下实体(简化):

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

@Entity
public class A {
    private Integer value;
};
当JPA为
整数创建列时,它使列
可为空
,但当为
int
创建列时,该列具有属性
非空
。Java中的所有装箱类型都是一样的

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

那么,如何强制JPA正确更新模式,而不丢失已经创建的数据呢?

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

解决方案:您必须手动执行此操作。我要做的是在我的源代码管理系统中保留一个.sql文件(或为每个更大的发布特性保留一个),该文件包含我所做的所有DB更改,以便我知道在生产时必须更改DB的内容。

当前的JPA规范不包括“模式演变”。您负责对所需的表进行更新,可以使用JPA提供程序将DDL生成到文件中,然后编写更新脚本来迁移数据
@Entity
public class A {
    private Integer value;
};