【发布时间】:2017-10-30 23:35:39
【问题描述】:
我正在使用 Spring Boot、REST 和 JPA 来构建我的应用程序。在应用程序中,有 2 个实体具有一对多关系。
实体 1:
@Entity
@Table( name = "report")
@JsonIgnoreProperties(ignoreUnknown = true)
public class CustomReport {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "REPORT_SEQ")
@SequenceGenerator(sequenceName = "REPORT_SEQ", allocationSize = 1, name = "REPORT_SEQ")
private Long id;
private String name;
private Long createdBy;
private Timestamp lastModifiedTimestamp;
@OneToMany(mappedBy = "customReport", cascade = CascadeType.ALL)
private Set<CustomReportActivity> customReportActivitySet;
public Set<CustomReportActivity> getCustomReportActivitySet() {
return customReportActivitySet;
}
public void setCustomReportActivitySet(Set<CustomReportActivity> customReportActivitySet) {
this.customReportActivitySet = customReportActivitySet;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Long getCreatedBy() {
return createdBy;
}
public void setCreatedBy(Long createdBy) {
this.createdBy = createdBy;
}
public Timestamp getLastModifiedTimestamp() {
return lastModifiedTimestamp;
}
public void setLastModifiedTimestamp(Timestamp lastModifiedTimestamp) {
this.lastModifiedTimestamp = lastModifiedTimestamp;
}
}
实体 2:
@Entity
@Table( name = "report_activity")
public class CustomReportActivity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "REPORT_ACTIVITY_SEQ")
@SequenceGenerator(sequenceName = "REPORT_ACTIVITY_SEQ", allocationSize = 1, name = "REPORT_ACTIVITY_SEQ")
private Long id;
String activityName;
@ManyToOne
@JoinColumn( name="report_id" )
@JsonBackReference
private CustomReport customReport;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getActivityName() {
return activityName;
}
public void setActivityName(String activityName) {
this.activityName = activityName;
}
public CustomReport getCustomReport() {
return customReport;
}
public void setCustomReport(CustomReport customReport) {
this.customReport = customReport;
}
}
我的请求 JSON 如下:
{
"name": "test report",
"createdBy" : 129,
"customReportActivitySet": [
{"activityName":"a"},
{"activityName":"b"},
{"activityName":"c"},
{"activityName":"d"},
{"activityName":"e"}
]
}
我想一次性保存两个实体。我通过以下方式实现了保存功能:
@RequestMapping(value="/save", method = RequestMethod.POST)
public ResponseEntity<?> addReport(@RequestBody CustomReport customReport) {
return new ResponseEntity<>(customReportService.createCustomReport(customReport), HttpStatus.CREATED);
}
CustomReportService 方法:
public CustomReport createCustomReport(CustomReport customReport) {
return customReportRepository.save(customReport);
}
自定义存储库:
public interface CustomReportRepository extends CrudRepository<CustomReport, Long> {
}
但是我得到了约束违反异常:
java.sql.SQLIntegrityConstraintViolationException: ORA-01400: 不能 将 NULL 插入 ("REPORT_ACTIVITY"."REPORT_ID")
是否可以在一次保存操作中保存两个实体?
请帮忙!
【问题讨论】:
-
customReportService.createCustomReport 里面有什么?
-
@MaciejKowalski 我已经编辑了我的帖子。请检查
-
@MaciejKowalski 我正在创建另一种服务方法来填充子实体的所有属性。不知道我们可以通过在保存之前在子实体中添加自定义报表关系来做到这一点。你的解决方案奏效了。非常感谢!
标签: java spring jpa spring-boot one-to-many