当前位置: 首页 > 知识库问答 >
问题:

如何在java Spring Boot中正确保存关系实体

陆翰学
2023-03-14

我有两个在Spring启动与jhipster第一个生成的实体:

学生:@ Column(name = " child _ birth _ date ")private local date child birth date;

@Column(name = "street")
private String street;

@Column(name = "postal")
private Long postal;

@ManyToMany
@JoinTable(
    name = "rel_student__sureler",
    joinColumns = @JoinColumn(name = "student_id"),
    inverseJoinColumns = @JoinColumn(name = "sureler_id")
)
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@JsonIgnoreProperties(value = { "students" }, allowSetters = true)
private Set<Sureler> surelers = new HashSet<>();

和Sureler实体:

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

    @Column(name = "student_status")
    private String studentStatus;

    @ManyToMany(mappedBy = "surelers")
    @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
    @JsonIgnoreProperties(value = { "surelers" }, allowSetters = true)
    private Set<Student> students = new HashSet<>();

现在,我有了以下代码来更新我的学生身份:

 @Transactional
    @PatchMapping(value = "/students/{id}", consumes = { "application/json", "application/merge-patch+json" })
    public ResponseEntity<StudentDTO> partialUpdateStudent(
        @PathVariable(value = "id", required = false) final Long id,
        @RequestParam String sureName,
        @RequestParam String studentStatus
    ) throws URISyntaxException {
        log.debug("REST request to partial update Student partially : {}", id);

        // Fetch the student entity from the database
        Student student = studentRepository.findById(id)
            .orElseThrow(() -> new EntityNotFoundException("Student with id " + id + " not found"));

        Sureler sure = surelerRepository.findByName(sureName)
            .orElseGet(() -> {
                Sureler newSureler = new Sureler();
                newSureler.setName(sureName);
                return surelerRepository.save(newSureler);
            });

        student.getSurelers().add(sure);

        // Update the necessary fields
        student.getSurelers().forEach(sureler -> {
            if (sureler.getName().equals(sureName)) {
                sureler.setStudentStatus(studentStatus);
            }
        });

        // Save the updated entity using the repository
        Student updatedStudent = studentRepository.save(student);
        StudentDTO result = studentMapper.toDto(updatedStudent);

        return ResponseEntity.ok()
            .headers(HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, result.getId().toString()))
            .body(result);
    } 

但是这段代码会产生这样的输出:

{
  "id": 5,
  "parentFirstName": "Avon",
  "parentLastName": "Buckinghamshire transmitter",
  "parentPhoneNumber": "Steel Triple-buffered Gibraltar",
  "parentEmailAdress": "microchip Ruble",
  "parentType": "Refined",
  "childFirstName": "Alperen",
  "childLastName": "Toraman",
  "childBirthDate": "2023-02-23",
  "street": "Klose Turnpike",
  "postal": 64876,
  "surelers": [
    {
      "id": 3,
      "name": null,
      "studentStatus": null
    }
  ]
}

正如你可以看到surelers列表的名称和学生状态为空,但我不明白为什么,这似乎是由entityManager的合并方法,这是在保存方法(Jparepository)中使用的,至少这是我通过调试得出的结论,但我找不到解决方案。

需要注意的一件事Sureler表的状态可以为null,唯一重要的是更新学生时生成的实例具有状态集。名称存在

共有2个答案

冷吉星
2023-03-14

问题解决了,我认为问题出在数据库里,把新的值保存在表中,在把它们添加给学生之前,已经足够了。但是这也带来了另一个问题,我在这个帖子中提到了:如何在jhipster spring boot中正确地保存多对多

陆俭
2023-03-14

可能是懒惰的初始化。默认情况下,多对多关系由 JPA 延迟初始化,因此不会获取 sureler 实体的属性,因此保持 null。尝试在您的存储库中@EntityGraph注释来纠正这一点,以强制急切获取。或自定义查询。

 类似资料:
  • 一个udit.java Chapter.java 审计控制员。JAVA

  • 问题内容: 在使用Hibernate的Spring MVC应用程序中,无法将在ManyToMany关系中连接两个实体的列表正确填充。实体是和。该实体有一个属性,它是名单的实体,而这是不正确填充。有人可以帮我弄清楚如何修正我的代码,以便实体开始正确填充吗? 未能正确填充ArrayList的控制器方法的代码如下: 前面代码中的命令输出以下内容: 从上面的输出可以看到,只有一个对象大于0 。尽管事实是每

  • 问题内容: 我与共享密钥具有一对一的双向实体关系。当我尝试保存关联的所有者时,对于该关系的拥有方,我收到一个“生成的null ID”异常。我正在使用hibernate- entitymanager并使用spring进行事务管理。 所属实体 所属实体 并且下面的代码用于保存实体: 在休眠3.5.0-最终版中,这一切都可以正常工作。尝试升级到3.5.6-Final或3.6.0.Final时,是我开始获

  • 我正在学习Spring Core认证,在提供的学习材料中,我对这个问题有一些疑问: 关闭应用程序上下文的首选方法是什么? 我知道如果我有这样的东西: 通过在上下文对象上使用close()方法,ApplicationContext被关闭,应用程序被销毁。 但我认为这不是我必须做的最好的方式。 阅读官方留档,我发现我也可以这样做: 在JVM中注册一个关闭挂钩,因此JVM将在JVM退出之前触发Sprin

  • 问题内容: 我在SO上发现了许多类似问题的实例,但不幸的是,没有答案符合我的要求。 我对人像和风景有不同的布局,并且我使用的是后向堆栈,这既妨碍了我的使用,又使我无法使用配置更改例程。 我在TextViews中向用户显示某些信息,这些信息不会保存在默认处理程序中。当仅使用“活动”编写我的应用程序时,以下方法运行良好: 使用,这仅在非常特殊的情况下有效。具体地说,令人震惊的是替换片段,将其放回堆栈中

  • 我有一个实体: 要创建上述实体并将其保存到JPA存储库中,我将执行以下操作: 由于DB中的表存储了候选对象的FK,我认为设置一个id就足够了。但JPA希望我设置候选对象。这迫使我查询候选存储库。 是否需要从候选库中查询候选人以保存,或者如果我有可用的候选人id,我不能直接设置它?

  • 问题内容: 我与共享密钥具有一对一的双向实体关系。当我尝试保存关联的所有者时,对于该关系的拥有方,我收到一个“生成的null ID”异常。我正在使用hibernate- entitymanager并使用spring进行事务管理。 所属实体 所属实体 并且以下代码用于保存实体: 在hibernate3.5.0-最终版中,这一切都可以正常工作。尝试升级到3.5.6-Final或3.6.0.Final时

  • 我在SO上发现了许多类似问题的例子,但不幸的是,没有一个答案符合我的要求。 我对纵向和横向有不同的布局,并且我使用了后退堆栈,这既阻止了我使用又阻止了使用配置更改例程的技巧。 我在TextViews中向用户显示某些信息,这些信息不会保存在默认处理程序中。在单独使用活动编写应用程序时,以下操作非常有效: 对于s,这只在非常特定的情况下起作用。具体地说,最可怕的是替换一个片段,把它放在后面的堆栈中,然