首页 > 解决方案 > 双向映射返回 null

问题描述

双向 OneToMany 和 ManyToOne 在保存时返回“NULL not allowed for column”

@Getter
@Setter
@ToString(callSuper = true)
@Entity
@Table(name = "scale")
@SequenceGenerator(name = "default_generator", sequenceName = "scale_sequence", allocationSize = 1)
public class Scale extends DateTimeAwareDomainEntity {

    @Column(name = "name", nullable = false)
    private String name;

    @Enumerated(EnumType.STRING)
    @Column(name = "scale_group", nullable = false)
    private ScaleGroup group;

    @Enumerated(EnumType.STRING)
    @Column(name = "behavior", nullable = false)
    private ScaleBehavior behavior;

    @Enumerated(EnumType.STRING)
    @Column(name = "calculation_strategy", nullable = false)
    private CalculationStrategy calculationStrategy;

    @Enumerated(EnumType.STRING)
    @Column(name = "type", nullable = false)
    private ScaleType type;

    @Enumerated(EnumType.STRING)
    @Column(name = "display_format", nullable = false)
    private ScaleDisplayFormat displayFormat;

    @Column(name = "likert", nullable = false)
    private Integer likert;

    @Enumerated(EnumType.STRING)
    @Column(name = "chart_type", nullable = false)
    private ScaleChartType chartType;

    @Column(name = "subscale_selected", nullable = false)
    private Boolean isSubScaleSelected;

    @Column(name = "description", nullable = false)
    private String description;

    @OneToMany(mappedBy = "scale", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
    private Set<SubScale> subScales = new LinkedHashSet<>();

    public Scale() {
    }

    public Scale(final LocalDateTime created) {
        super(created);
    }

    public interface ScaleFieldNames extends DomainEntityFieldNames {
        String NAME = "name";
        String GROUP = "group";
        String BEHAVIOR = "behavior";
        String CALCULATION_STRATEGY = "calculationStrategy";
        String TYPE = "type";
        String DISPLAY_FORMAT = "displayFormat";
        String LIKERT = "likert";
        String CHART_TYPE = "chartType";
        String HAS_SUBSCALE = "hasSubscale";
        String DESCRIPTION = "description";
    }
}
@Getter
@Setter
@ToString(callSuper = true)
@Entity
@Table(name = "sub_scale")
@SequenceGenerator(name = "default_generator", sequenceName = "sub_scale_sequence", allocationSize = 1)
public class SubScale extends DomainEntity {

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "scale_id")
    private Scale scale;

    @Column(name = "name", nullable = false)
    private String name;
}

当我在保存之前评估子刻度时,刻度为空并且我得到了这个异常。

引起:org.postgresql.util.PSQLException:错误:“scale_id”列中的空值违反非空约束

这段代码有什么问题?

我正在使用 postgres 数据库,

private void accumulateScale(final ScaleModificationRequest request, final Scale scale) {
        scale.setName(request.getName());
        scale.setGroup(request.getGroup());
        scale.setBehavior(request.getBehavior());
        scale.setCalculationStrategy(request.getCalculationStrategy());
        scale.setType(request.getType());
        scale.setDisplayFormat(request.getDisplayFormat());
        scale.setLikert(request.getLikert());
        scale.setChartType(request.getChartType());
        scale.setIsSubScaleSelected(request.isSubScaleSelected());
        scale.setDescription(request.getDescription());
        if (request.isSubScaleSelected() && !request.getSubScales().isEmpty()) {
            scale.getSubScales().addAll(Sets.difference(request.getSubScales(), scale.getSubScales()));
            scale.getSubScales().removeIf(it -> Sets.difference(scale.getSubScales(), request.getSubScales()).contains(it));
        }
    }

标签: javahibernatejpa

解决方案


推荐阅读