gpt4 book ai didi

java - 如何通过 REST API 关联两个实体

转载 作者:行者123 更新时间:2023-12-02 02:39:38 25 4
gpt4 key购买 nike

我想通过 REST API 关联双向两个实体。假设有一位老师和一个类(class)。类(class)有一位教育者,即老师,而老师有他正在教育的类(class)。

我见过有关实体关联的其他问题,但对我不起作用。我已经尝试过 @PreUpdate、@PrePersist 方法,但我收到了空指针异常...我也尝试过发送资源的 URL关联实体地点。

类(没有其他属性、getter、setter 等)

@Entity
public class Class extends NamedEntity {
@OneToOne(mappedBy = "educatedClass")
private Teacher educator;
}

教师(没有其他属性、getter、setter 等)

@Entity
public class Teacher extends User {
@OneToOne
private Class educatedClass;
}

类 Controller (没有其他方法等)

@RestController
@RequestMapping(value = "classes")
public class ClassController {
@PatchMapping(value = "/{id}")
@ResponseStatus(HttpStatus.OK)
public Class updateClass(@PathVariable Integer id, @RequestBody Class class_) {
return classService.updateClass(id, class_);
}
}

类服务(没有其他方法、属性等)

@Service
public class ClassServiceImpl implements ClassService{
@Override
public Class updateClass(Integer id, Class class_) {
logger.info(String.format("Update class of ID %d, %s", id, class_));
Class updatedClass = classRepository.findById(id).orElseThrow(() ->
new ResourceNotFoundException("Class not found"));

updatedClass.update(class_);
return classRepository.save(updatedClass);
}
}

类存储库

@Repository
public interface ClassRepository extends PagingAndSortingRepository<Class, Integer>,
JpaSpecificationExecutor<Class> {
Page<Class> findAllBySubjectsId(Integer id, Pageable pageable);
}

我也有教师的 Controller 、服务、存储库,但它看起来与上面的非常相似。

正如我提到的,除其他外,我尝试过 Postman request但我得到了

JSON parse error: Cannot construct instance of `blumczynski.com.schoolmanagement.models.Teacher` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('http://localhost:8080/api/users/teachers/14'); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `blumczynski.com.schoolmanagement.models.Teacher`

最佳答案

异常(exception)是关于构造 Teacher 对象。您必须将教师对象设置为 json 格式而不是 url。

您是否在这两个类上尝试过 @OneToOne(cascade = CascadeType.PERSIST) ?如此链接 https://howtodoinjava.com/hibernate/hibernate-jpa-cascade-types/ 中所述

如果它不起作用。请尝试使某个实体允许关联实体为空。保存教师后,持久化该类,然后在服务层类中但在非事务性方法中使用类 id 更新教师,以便获得该类的 id。您可以通过添加 Teacher_id 和 class_id 并将 Teacher 类或 Class 类作为 @Transient 一对一关系引用来实现此目的

在我看来,作为一种设计,不要尝试从教师中删除 class_id,因为教师可能有多个类(class)。

关于java - 如何通过 REST API 关联两个实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57187069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com