【问题标题】:How to associate two entities via REST API如何通过 REST API 关联两个实体
【发布时间】:2019-12-02 20:27:40
【问题描述】:

我想通过 REST API 关联双向两个实体。 假设有老师和班级。班级有一个教育者,即老师,老师有他正在教育的班级。

我看到了有关实体关联的其他问题,但对我没有用。 我试过@PreUpdate,@PrePersist 方法,但我得到空指针异常......我也试过发送资源的 URL 关联实体地点。

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

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

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

@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`

【问题讨论】:

    标签: java spring rest jpa spring-data-jpa


    【解决方案1】:

    例外是关于构造 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,因为老师可能有多个班级。

    【讨论】:

      猜你喜欢
      • 2015-05-31
      • 2014-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-14
      • 1970-01-01
      相关资源
      最近更新 更多