一对多字段不能为空

问题描述 投票:0回答:1

您好,我正在寻找很长时间来访问我的数据并将其发布到我的数据库中。我成功发送了报告的名称,但未发送链接的章节。我的审计章节以一对多的关系映射。现在我在Spring Boot中有一个例外,他说:The field 'audit_id' can't be empty (null)我已经跌倒了,但是我不知道如何处理这个例外...我认为插入mysql的顺序存在问题。首先需要发布审计部分,然后是章节,以实例化audit_id到审计。我尝试使用注释Order,但方法不正确或使用不正确。感谢您的帮助

这里是我的database

有我的要求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"
        }
    ]
}

下面是代码示例。

Audit.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;
  }

Chapter.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) {
    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);
    }
  }
}
java spring-boot one-to-many
1个回答
0
投票

您应使用@GeneratedValue(strategy = GenerationType.AUTO)

让我回答这个问题:

首先,使用注释作为我们的configure方法只是一种便捷的方法,而不是应对无休止的XML配置文件。

@Id注释是从javax.persistence.Id继承的,表示下面的成员字段是当前实体的主键。因此,您的Hibernate和spring框架以及您可以基于此批注进行一些反映。有关详细信息,请检查javadoc中的ID

@GeneratedValue注释用于配置指定列(字段)的递增方式。例如,当使用Mysql时,您可以在表的定义中指定auto_increment使其自增量,然后使用

@GeneratedValue(strategy = GenerationType.IDENTITY)

在Java代码中表示您也已确认使用此数据库服务器端策略。另外,您可以更改此批注中的值以适合不同的要求。

1。在数据库中定义序列例如,Oracle必须使用序列作为增量方法,比如说我们在Oracle中创建一个序列:

create sequence oracle_seq;

2。请参考数据库顺序

现在我们已经在数据库中有了序列,但是我们需要使用@SequenceGenerator建立Java和DB之间的关系:

@@ SequenceGenerator(name =“ seq”,sequenceName =“ oracle_seq”)sequenceName是Oracle中序列的真实名称,name是您要在Java中调用的名称。如果与名称不同,则需要指定sequenceName,否则只需使用name即可。我通常会忽略sequenceName以节省时间。

3。 Java中的使用顺序

最后,是时候在Java中使用此序列了。只需添加@GeneratedValue:

@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq")

生成器字段指您要使用的序列生成器。请注意,它不是数据库中的真实序列名称,而是您在SequenceGenerator的名称字段中指定的名称。

4。完成

所以完整的版本应该是这样的:

public class MyTable
{
    @Id
    @SequenceGenerator(name="seq",sequenceName="oracle_seq")        
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq")               
    private Integer pid;
}
© www.soinside.com 2019 - 2024. All rights reserved.