Java 如何通过RESTAPI关联两个实体

Java 如何通过RESTAPI关联两个实体,java,spring,rest,jpa,spring-data-jpa,Java,Spring,Rest,Jpa,Spring Data Jpa,我想通过RESTAPI将两个实体关联起来。 假设有一个老师和一个班级。班级里有一个教育者,他就是老师,而老师就是他所教育的班级 我见过关于实体关联的其他问题,但对我来说并不适用。 我尝试了@PreUpdate、@PrePersist方法,但得到了空指针异常。。。我还尝试在中发送资源的URL 关联实体位置 类(没有其他属性、getter、setter等) 教师(无其他属性、获取者、设置者等) 类控制器(无其他方法等) 类服务(无其他方法、属性等) 类存储库 @Repository public i

我想通过RESTAPI将两个实体关联起来。 假设有一个老师和一个班级。班级里有一个教育者,他就是老师,而老师就是他所教育的班级

我见过关于实体关联的其他问题,但对我来说并不适用。 我尝试了@PreUpdate、@PrePersist方法,但得到了空指针异常。。。我还尝试在中发送资源的URL 关联实体位置

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

教师(无其他属性、获取者、设置者等)

类控制器(无其他方法等)

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

类存储库

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

例外是关于构造教师对象。 您必须将教师对象设置为json格式,而不是url

您是否在这两个类上都尝试了@OneToOne(cascade=CascadeType.PERSIST)?如本链接所述

如果它不起作用。请尝试使关联实体的实体数为空。保存teacher后,持久化该类,然后在服务层类中使用类id更新该类,但使用非事务性方法,以便获得该类的id。 您可以通过添加教师id和班级id来实现这一点,并将班级教师或班级称为@Transient一对一关系


在我看来,作为一种设计,尽量从老师那里删除班级id,因为老师可能有多个班级

例外是关于构造教师对象。 您必须将教师对象设置为json格式,而不是url

您是否在这两个类上都尝试了@OneToOne(cascade=CascadeType.PERSIST)?如本链接所述

如果它不起作用。请尝试使关联实体的实体数为空。保存teacher后,持久化该类,然后在服务层类中使用类id更新该类,但使用非事务性方法,以便获得该类的id。 您可以通过添加教师id和班级id来实现这一点,并将班级教师或班级称为@Transient一对一关系

在我看来,作为一种设计,尽量从老师那里删除班级id,因为老师可能有多个班级

@Entity
public class Teacher extends User {
    @OneToOne
    private Class educatedClass;
}
@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);
}
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`