Spring Boot - problem przy zapisaniu rekordu do reposytorium JPA

Spring Boot - problem przy zapisaniu rekordu do reposytorium JPA
K0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 29
0

Hej.
Próbuję stworzyć bazę danych która będzie przechowywać sekwencje stron (page) dla kursu (course), jednak przy dodawaniu page wyrzuca mi:

Kopiuj
Parameter value [5] did not match expected type [web.javaLearn.model.course.Course (n/a)]

Mam zapisane dwie encje w ten sposób:

Page:

Kopiuj
@Data
@Entity
@Builder
public class Page {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private Float pageOrder;
    @Enumerated(EnumType.STRING)
    private PageType type;
    private String data;

    @ManyToOne(cascade = CascadeType.ALL)
    private Course course;
}

Course:

Kopiuj
@Data
@Entity
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Course {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String title;
    private String description;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "course")
    List<Page> pageList;
}

Repozytorium page:

Kopiuj
@Repository
public interface PageRepository extends JpaRepository<Page, Long> {
    @Query(value = "SELECT * FROM page WHERE course_id = ?1 ORDER BY page_order", nativeQuery = true)
    List<Page> findAllPagesByCourse(Long courseId);

    Page findFirstByCourseOrderByPageOrderDesc(Long courseId);
}

Moja funkcja w serwisie w której zapisuję stronę do repozytorium wygląda tak:

Kopiuj
@Transactional
    public Page savePage(PageRequest pageRequest, Long courseId) {
        Course c = courseRepository.findById(courseId).orElseThrow();
        Page p = Page.builder()
                .name(pageRequest.getName())
                .pageOrder(pageRepository.findFirstByCourseOrderByPageOrderDesc(courseId).getPageOrder()+1)
                .type(pageRequest.getType())
                .data(pageRequest.getData())
                .course(c)
                .build();
        pageRepository.save(p);
        return p;
    }

Niby Course c = courseRepository.findById(courseId).orElseThrow(); zwraca mi poprawny obiekt Course, więc o co może chodzić?

SA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 94
1

Zrób sobie jedno repozytorium CourseRepository i na encji Course metodę addPeage, bo Course i Page są ze sobą ściśle powiązane (nie ma sensu, żeby Page istniało bez Course + relacja one to many). Wtedy twoja metoda będzie wyglądać mniej więcej tak:

Kopiuj
@Transactional
public Page savePage(PageRequest pageRequest, Long courseId) {
courseRepository.findById(courseId)
.map(course -> course.addPeage(Page.builder...itd.))
.orElseThrow()
}

Jak używasz @Transactional to nie musisz wołać save.

BA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 19
0

Jeżeli jako parametr podajesz courseId to raczej metoda powinna mieć sygnaturę findFirstByCourseIdOrderByPageOrderDesc(Long courseId). W twoim przypadku jako parametr metody powinieneś przekazać obiekt Course co zresztą masz napisane tutaj Parameter value [5] did not match expected type [web.javaLearn.model.course.Course (n/a)]

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.