java-在Spring Boot中一次保存一个实体及其所有相关实体
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-在Spring Boot中一次保存一个实体及其所有相关实体,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3431字,纯文字阅读大概需要5分钟。
内容图文
![java-在Spring Boot中一次保存一个实体及其所有相关实体](/upload/InfoBanner/zyjiaocheng/667/c3fcefe2a8c349af88da312932b1ff06.jpg)
我正在使用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);
}
CustomRepository:
public interface CustomReportRepository extends CrudRepository<CustomReport, Long> {
}
但是我得到了违反约束的异常:
java.sql.SQLIntegrityConstraintViolationException: ORA-01400: cannot
insert NULL into (“REPORT_ACTIVITY”.”REPORT_ID”)
是否可以在一个保存操作中保存两个实体?
请帮忙!
解决方法:
您将不得不添加一小段代码,以填充CustomReport实例中的每个CustomReportActivity.只有这样,持久性提供才能成功执行级联保存操作:
public CustomReport createCustomReport(CustomReport customReport) {
customReport.getCustomReportActivitySet.forEach((activity) -> {
activity.setCustomReport(customReport);
});
return customReportRepository.save(customReport);
}
底线是必须在关系的两侧设置依赖项.
内容总结
以上是互联网集市为您收集整理的java-在Spring Boot中一次保存一个实体及其所有相关实体全部内容,希望文章能够帮你解决java-在Spring Boot中一次保存一个实体及其所有相关实体所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。