java - 双向映射返回 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));
}
}
解决方案
推荐阅读
- openapi - Spring Cloud Contract,带有合约扩展的 Openapi
- python - 如何从 Python 中的字符串中删除某些字符或仅从中提取一些行?
- python - 对不同的项目使用不同的anaconda环境有什么好处?
- node.js - 为什么 mypartial.ejs 没有显示?
- python - 'SQLite 时间类型只接受 Python 时间对象作为输入。' 数据库错误
- javascript - 定位 javascript 图像
- javascript - 无效的查询。您不能使用多个“in”过滤器
- django - 在我的 heroku 应用程序上访问静态图像的 url 是什么
- javascript - 从输入传递事件元素
- curl - 获取网页的 cURL 参数