持久化@Column nullable = false可以插入null。

7
我希望将此列设置为不为空,但是当我插入一个具有空值的注册信息时,它允许我插入。我已经阅读了文档,但我不知道为什么不起作用。 @Column(name="QWECOD", nullable = false) private String qwe; 谢谢!
更新:我正在使用Toplink和java org.eclipse.persistence.eclipselink:2.4.2
3个回答

5
我认为 nullable 是在使用 entitymanager 的实现生成架构时使用的。我不知道在持久化实体时是否需要验证它,也不确定是否必须进行验证。
如果使用 @NotNull 注释可能会有帮助,但这不是纯 JPA。它定义在 JSR-303 中。
Stackoverflow 上也有一个讨论您问题的主题:Stackoverflow - Confusion notnull vs columnnullable false
编辑:在JPA 2.1规范中,有这样一个部分:

11.2.2.1 Column
Column注释的以下元素用于模式生成:
名称
唯一
可空
columnDefinition 表格
长度(仅限字符串值列) 精确数字(十进制/数值)列的精度 精确数字(十进制/数值)列的标度 请参见第11.1.9节以了解适用于这些元素和列创建的规则。可以使用AttributeOverride注释来覆盖列映射。

由于没有其他提示,我假设以下情况: 如果符合JPA的EntityManager创建模式,则必须使用等效的与DB相关的约束(例如notnull)在特定列上应用可为空约束。 当您持久化实体时,它不会被EntityManager检查,而是由底层数据库检查。因此,如果数据库引发错误,则EntityManager将向调用者传播此错误。
如果您自己创建表而不使用DB的可空约束,则实体管理器尝试持久化实体并且不会出现错误 --> 持久化是可以的,尽管存在一些不应该存在的空值。

Nullable 在生成和 bean 验证中使用,当您想要持久化 null 时。此外,@NotNull(Nullable = false) 是相同的。 - Vianney Dupoy de Guitard
我在JPA 2.1规范中找不到任何使用@NotNull的提示 - 因为它在规范中没有定义。此外,在规范中它只是模糊地定义了一下(我会查看规范并更新我的答案)。 - Andreas Aumayr
@NotNull 在 JPA 规范中并没有定义,但 Hibernate 将其用作 nullable=false 的别名。请查看 NotNullValidator:http://grepcode.com/file/repo1.maven.org/maven2/hibernate/hibernate-annotations/3.1beta4/org/hibernate/validator/NotNullValidator.java#NotNullValidator - Vianney Dupoy de Guitard
请纠正我,但我在问题中没有看到任何提示作者使用Hibernate? 我已经添加了两个相关链接以提供更多信息。同时我说过我不确定实现entitymanager是否必须使用它。 现在回到主题:我将更新我的答案,并添加我在JPA 2.1规范中找到的唯一部分,其中给出了在哪里使用nullable的提示。 - Andreas Aumayr
我提到了Hibernate,因为据我所知,它是唯一一个使用JSR 303中的@NotNull的JPA兼容持久性管理器;)。我只是想澄清@NotNull=nullable=false,所以不会有任何区别。 - Vianney Dupoy de Guitard
我还有另一个疑问,是更好的在数据库中验证数据(带限制)还是在持久化之前进行?有人知道任何相关文章吗? - Mathew Rock

2

如果您直接在数据库中进行插入操作,则Hibernate或任何持久性提供程序将无法控制您。请尝试使用持久性提供程序进行插入操作。


Hibernate应该在数据库中设置列的限制为NOT NULL吗?这样数据库本身就不会让您插入NULL值。 - svz
2
@svz 取决于您是否使用Hibernate生成的DDL。并非每个人都这样做。 - chrylis -cautiouslyoptimistic-
让 HBN 为您创建表格,这样才能实现。 - Pankaj Sharma
1
如果您从实体生成数据库模式,则很可能会出现,但是当您使用现有模式编写实体时,nullable 仅为持久性提供程序提供提示。 - DominikM

0

可能在基础中已经有了那个带有空值的字段 在这种情况下,您必须手动更改字段的空值 MySql查询:

 alter table [table] modify [column] [[Column_Type] ej: vachar] not null;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接