java - 一对多映射关系未正确保存数据

标签 java list spring-boot arraylist one-to-many

我正在寻找很长时间来访问我的数据并将其发布到我的数据库中。 我成功发送了报告的名称,但没有发送链接到的章节。我对映射到一对多关系的章节进行了审计。谢谢您的帮助,我希望我足够清楚^^“,我是法国人和开发新手。 我的数据库:Database 这是我对 Spring Boot 的请求 json:

{
    "nameReport": "Title of the report",
    "chapters": [
        {
            "titleChap": "Title of the chapter",
            "descChap": "The description of the chapter"
        },
            "titleChap": "2nd Title of the chapter",
            "descChap": "2nd description of the chapter"
        }
    ]
}

审计.java

@Entity
@Table(name="audits")

public class Audit {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "id", nullable = false, unique = true)
  private Integer id;

  @Column(name = "report_name")
  private String nameReport;

  @OneToMany(fetch = FetchType.LAZY, mappedBy="audit", cascade = CascadeType.ALL)
  private Collection<Chapter> chapters;

  public Audit() {
  }

  public Audit(String nameReport, Collection<Chapter> chapters) {
    this.chapters = new ArrayList<Chapter>();
    this.nameReport = nameReport;
  }

  public Integer getId() {
    return id;
  }

  public void setId(Integer id) {
    this.id = id;
  }

  public String getNameReport() {
    return nameReport;
  }

  public void setNameReport(String nameReport) {
    this.nameReport = nameReport;
  }

  public Collection<Chapter> getChapters() {
    return chapters;
  }

  public void setChapters(Collection<Chapter> chapters) {
    this.chapters = chapters;
  }

章节.java

@Entity
@Table(name="chapitres")

@Component
public class Chapter {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
//  @GeneratedValue
  @Column(name = "id")
  private Integer id;

  @ManyToOne(fetch = FetchType.LAZY, optional = false)
//  @ManyToOne
  @JoinColumn(name = "audit_id")
  private Audit audit;

  @Column(name = "chapter_title")
  private String titleChap;

  @Column(name = "chapter_desc")
  private String descChap;

  public Chapter() {}

  public Integer getId() {
    return id;
  }

  public void setId(Integer id) {
    this.id = id;
  }

  public Audit getAudit() {
    return audit;
  }

  public void setAudit(Audit audit) {
    this.audit = audit;
  }

  public String getTitleChap() {
    return titleChap;
  }

  public void setTitleChap(String titleChap) {
    this.titleChap = titleChap;
  }

  public String getDescChap() {
    return descChap;
  }

  public void setDescChap(String descChap) {
    this.descChap = descChap;
  }

auditController.java

@RestController
@RequestMapping(value = "/api")

public class AuditController {
  private AuditRepository auditRepository;

  @Autowired
  AuditController(AuditRepository auditRepository){
    this.auditRepository = auditRepository;
  }

  @PostMapping("/audits")
  public ResponseEntity<Audit> postAudit(@RequestBody Audit audit, @RequestBody Collection<Chapter> chapters) {
    try {
      Audit _audit = auditRepository.save(new Audit(audit.getNameReport(), audit.getChapters()));
      return new ResponseEntity<>(_audit, HttpStatus.CREATED);
    } catch (Exception e) {
      return new ResponseEntity<>(null, HttpStatus.EXPECTATION_FAILED);
    }
  }

  @GetMapping("/audits")
  public ResponseEntity<List<Audit>> getAllAudits() {
    List<Audit> audits = new ArrayList<>();
    try {
      auditRepository.findAll().forEach(audits::add);

      if(audits.isEmpty()) {
        return new ResponseEntity<>(audits, HttpStatus.NO_CONTENT);
      }
      return new ResponseEntity<>(audits, HttpStatus.OK);
    } catch (Exception e) {
      return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR);
    }
  }

  @GetMapping("/audits/{id}")
  public ResponseEntity<Audit> getAuditById(@PathVariable("id") Integer id) {
    Optional<Audit> auditData =  auditRepository.findById(id);

    if (auditData.isPresent()) {
      return new ResponseEntity<>(auditData.get(), HttpStatus.OK);
    } else {
      return new ResponseEntity<>(HttpStatus.NOT_FOUND);
    }
  }
}

最佳答案

我认为这就是解决方案

public Audit(String nameReport, Collection<Chapter> chapters) {
    this.chapters = new ArrayList<Chapter>();
    this.nameReport = nameReport;
  }

您正在此处创建新的数组列表,因此章节不会添加到 Audit 中。您应该将其更改为

 public Audit(String nameReport, Collection<Chapter> chapters) {
        this.chapters =chapters;
        this.nameReport = nameReport;
      }

关于java - 一对多映射关系未正确保存数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59765202/

相关文章:

Java 格式化以获取最后计数

java - 创建可配置的依赖资源

java - 大括号的可用性

list - 如何从 Dart 列表中删除相似的元素?

spring-boot - 在 Spring Boot 中构建分层 jar 时,如何在层中包含多模块项目 jar?

java - 检查 String[] 中的 String 是否在 ArrayList<string> 中

spring - 注入(inject)用 Spring 扩展抽象类的类列表

python - 为什么 '.sort()' 在 Python 中导致列表为 'None'?

java - 如何检查一个类是否在 Java 进程中加载

java - Spring MVC @ModelAttribute 作为方法参数注解