不允许为空,但应该可以为空

Posted

技术标签:

【中文标题】不允许为空,但应该可以为空【英文标题】:Null not allowed, but should be nullable 【发布时间】:2013-04-24 00:56:42 【问题描述】:

我有两个表与一个映射表连接。不过,我遇到了一个空约束问题。下面是错误消息和两个映射。由于两者都是 manyTomany,我的假设是 many 可能都没有,我怎样才能使 product_id 或 category_id 可以为空?

错误信息

Caused by: org.h2.jdbc.JdbcBatchUpdateException: NULL not allowed for column "PRODUCT_OPTION_ID"; SQL statement:
insert into ImageMapping (product_id, image_id) values (?, ?) [23502-168]

分类

@JoinTable(
        name = "ImageMapping",
        joinColumns = @JoinColumn(name = "category_id"),
        inverseJoinColumns = @JoinColumn(name = "image_id")
)
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
private Set<Image> categoryImageId;

产品

@JoinTable(
        name="ImageMapping",
        joinColumns = @JoinColumn(name = "product_id"),
        inverseJoinColumns = @JoinColumn(name = "image_id")
)
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
private Set<Image> productImageGroup;

产品选项

@JoinTable(
        name="ImageMapping",
        joinColumns = @JoinColumn(name = "product_option_id"),
        inverseJoinColumns = @JoinColumn(name = "image_id")
)
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Set<Image> productOptionImageGroup;

【问题讨论】:

您确定在ImageMapping 表中没有另一个名为PRODUCT_OPTION_ID 的列吗? 是的,错误是关于列PRODUCT_OPTION_ID 而不是关于PRODUCT_IDIMAGE_ID 我昨晚才注意到这一点,但错误在 Product_option_id 和 Category_id 之间随机切换。我认为这是由于在 H2 中生成表时实体被抢购的顺序。我包括了产品选项加入。 向我们展示相关表格的CREATE TABLE 您应该为每个关联建立一个单独的连接表,而不是急于为所有关联使用同一个。 【参考方案1】:

您应该为每个关联创建一个单独的连接表,而不是尝试为所有关联使用同一个连接表。

【讨论】:

以上是关于不允许为空,但应该可以为空的主要内容,如果未能解决你的问题,请参考以下文章

linux字符测试

VS Code 上的错误,但 Dartpad 上没有。 - 字段 'percent' 应该被初始化,因为它的类型 'double' 不允许为空

Grails 域:允许字符串为空,但不允许为空

java判断字符串是不是为空

Flutter:应该初始化字段“initScreen”,因为它的类型“int”不允许为空。 int 初始化屏幕;

Java ResultSet 为空,但实际上它不应该是