0

I am having an issue with my API that I am not finding the solution.

My entities Housing

// imports...

@Entity
public class Housing implements Serializable {

    private static final Long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String title;
    @Column(columnDefinition = "TEXT")
    private String description;
    private Double rating;

    private Double dailyCost;

    private String address;

    private int capacity;

    @OneToMany
//    @JoinColumn(name = "booking_id")
    private HashSet<Booking> bookings = new HashSet<>();

    @ManyToOne
    private Category category;

    // to implement "facilities"
    //@OneToMany
    //private Facility facilities = new HashSet<>();

    public Housing() {
    }


    public Housing(Long id, String name, String title, String description, Double rating, Double dailyCost, String address, int capacity, HashSet<Booking> bookings, Category category) {
        this.id = id;
        this.name = name;
        this.title = title;
        this.description = description;
        this.rating = rating;
        this.dailyCost = dailyCost;
        this.address = address;
        this.capacity = capacity;
        this.bookings = bookings;
        this.category = category;
    }

 //autogenerated getters and setters...

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Housing housing = (Housing) o;
        return Objects.equals(id, housing.id);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }
}

Booking

// imports...

@Entity
public class Booking implements Serializable {

    private final static Long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String status;

    @OneToOne
//    @JoinColumn(name = "housing_id")
    private Housing housing;

    private LocalDate checkIn;

    private LocalDate checkOut;

    private int numberOfGuests;

    @ManyToOne
//    @JoinColumn(name = "client_id")
    private Client client;

     //autogenerated getters and setters...

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Booking booking = (Booking) o;
        return Objects.equals(id, booking.id);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }
}

I also have a DTO layer, so...

HousingDTO

// imports...

public class HousingDTO implements Serializable {

    private static final Long serialVersionUID = 1L;

    private Long id;

    //Name of the Hotel, Apartment, etc.
    private String name;

    // Title of the housing, example: King Room, Double Suite, Door 245, etc.
    private String title;
    private String description;
    private Double rating;

    private Double dailyCost;

    private String address;

    private int capacity;

    private HashSet<BookingDTO> bookings = new HashSet<>();


    public HousingDTO() {
    }


    public HousingDTO(Long id, String name, String title, String description, Double rating, Double dailyCost, String address, int capacity, HashSet<BookingDTO> bookings) {
        this.id = id;
        this.name = name;
        this.title = title;
        this.description = description;
        this.rating = rating;
        this.dailyCost = dailyCost;
        this.address = address;
        this.capacity = capacity;
        this.bookings = bookings;
    }

    public HousingDTO(Housing housing) {
        id = housing.getId();
        name = housing.getName();
        title = housing.getTitle();
        description = housing.getDescription();
        rating = housing.getRating();
        dailyCost = housing.getDailyCost();
        address = housing.getAddress();
        capacity = housing.getCapacity();
        housing.getBookings().forEach(booking -> this.bookings.add(new BookingDTO (booking)));
    }

     //autogenerated getters and setters...
}

BookingDTO

// imports...

public class BookingDTO implements Serializable {

    private static final Long serialVersionUID = 1L;

    private Long id;

    private String status;

    private Housing housing;

    private LocalDate checkIn;

    private LocalDate checkOut;

    private int numberOfGuests;

    private Client client;

    //autogenerated getters and setters...

    public BookingDTO() {
    }

    public BookingDTO(Long id, String status, Housing housing, LocalDate checkIn, LocalDate checkOut, int numberOfGuests, Client client) {
        this.id = id;
        this.status = status;
        this.housing = housing;
        this.checkIn = checkIn;
        this.checkOut = checkOut;
        this.numberOfGuests = numberOfGuests;
        this.client = client;
    }

    public BookingDTO(Booking booking) {
        id = booking.getId();
        status = booking.getStatus();
        housing = booking.getHousing();
        checkIn = booking.getCheckIn();
        checkOut = booking.getCheckOut();
        numberOfGuests = booking.getNumberOfGuests();
        client = booking.getClient();
    }
}

Services

HousingService

// imports...
@Service
public class HousingService {

    @Autowired
    private HousingRepository repository;

    @Autowired
    private BookingRepository bookingRepository;


    @Transactional(readOnly = true)
    public List<HousingDTO> findAllHousings() {
        List<Housing> list = repository.findAll();
        return list.stream().map(housing -> new ModelMapper().map(housing,HousingDTO.class)).collect(Collectors.toList());
    }


    @Transactional(readOnly = true)
    public Optional<HousingDTO> findHousingById(Long id) {
        // Obtaining Housing Optional by its ID.
        Optional<Housing> housing = repository.findById(id);
        // If it couldn't find, throw an Exception
        if (housing.isEmpty()) {
            throw new ResourceNotFoundException("Housing ID " + id + " could not be found.");
        }
        // Convert the found Optional into a DTO.
        HousingDTO dto = new ModelMapper().map(housing.get(), HousingDTO.class);
        // Creating and returning an Optional of DTO.
        return Optional.of(dto);
    }



    public HousingDTO addHousing (HousingDTO housingDto) {
        Housing housing = new ModelMapper().map(housingDto, Housing.class);
        repository.save(housing);
        return new HousingDTO(housing);
    }

    public void removeHousing (Long id) {
        if (findHousingById(id).isEmpty()) {
            throw new ResourceNotFoundException("Housing ID " + id + " not found");
        }
        repository.deleteById(id);
    }


    public HousingDTO updateHousing (Long id, HousingDTO housingDto) {
        if (findHousingById(id).isEmpty()) {
            throw new ResourceNotFoundException("Housing ID " + id + " not found");
        }

        housingDto.setId(id);
        Housing housing = new ModelMapper().map(housingDto, Housing.class);
        housing = repository.save(housing);
        return new HousingDTO(housing);
    }
}



BookingService

// imports...
@Service
public class BookingService {

    @Autowired
    private BookingRepository repository;

    @Transactional(readOnly = true)
    public List<BookingDTO> findAllBookings() {
        List<Booking> list = repository.findAll();
        return list.stream().map(booking -> new ModelMapper().map(booking,BookingDTO.class)).collect(Collectors.toList());
    }


    @Transactional(readOnly = true)
    public Optional<BookingDTO> findBookingById(Long id) {
        // Obtaining Booking Optional by its ID.
        Optional<Booking> booking = repository.findById(id);
        // If it couldn't find, throw an Exception
        if (booking.isEmpty()) {
            throw new ResourceNotFoundException("Booking ID " + id + " could not be found.");
        }
        // Convert the found Optional into a DTO.
        BookingDTO dto = new ModelMapper().map(booking.get(), BookingDTO.class);
        // Creating and returning an Optional of DTO.
        return Optional.of(dto);
    }



    public BookingDTO addBooking (BookingDTO bookingDto) {
        Booking booking = new ModelMapper().map(bookingDto, Booking.class);
        repository.save(booking);
        return new BookingDTO(booking);
    }


    public void removeBooking (Long id) {
        if (findBookingById(id).isEmpty()) {
            throw new ResourceNotFoundException("Booking ID " + id + " not found");
        }
        repository.deleteById(id);
    }


    public BookingDTO updateBooking (Long id, BookingDTO bookingDto) {
        if (findBookingById(id).isEmpty()) {
            throw new ResourceNotFoundException("Booking ID " + id + " not found");
        }

        bookingDto.setId(id);
        Booking booking = new ModelMapper().map(bookingDto, Booking.class);
        booking = repository.save(booking);
        return new BookingDTO(booking);
    }
}

And controllers

BookingController

// imports...
@RestController
@CrossOrigin(origins = "http://localhost:5173")
@RequestMapping("/bookings")
public class BookingController {

    @Autowired
    private BookingService service;

    @GetMapping
    public ResponseEntity<List<BookingDTO>> getAllBookings() {
        List<BookingDTO> bookings = service.findAllBookings();
        return new ResponseEntity<>(bookings, HttpStatus.OK);
    }

    @GetMapping("/{id}")
    public ResponseEntity<Optional<BookingDTO>> getBookingById (Long id) {
        Optional<BookingDTO> bookingDto = service.findBookingById(id);
        return new ResponseEntity<>(bookingDto, HttpStatus.OK);
    }

    @PostMapping
    public ResponseEntity<BookingDTO> createBooking (@RequestBody BookingDTO bookingDto) {
        bookingDto = service.addBooking(bookingDto);
        return new ResponseEntity<>(bookingDto, HttpStatus.CREATED);
    }

    @DeleteMapping("/{id}")
    public ResponseEntity<?> destroyBooking (@PathVariable Long id) {
        service.removeBooking(id);
        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
    }

    @PutMapping("/{id}")
    public ResponseEntity<BookingDTO> refreshBooking (@PathVariable Long id, @RequestBody BookingDTO bookingDto) {
        bookingDto = service.updateBooking(id, bookingDto);
        return new ResponseEntity<>(bookingDto, HttpStatus.OK);
    }
}

HousingController

// imports...
@RestController
@CrossOrigin(origins = "http://localhost:5173")
@RequestMapping("/housing")
public class HousingController {

    @Autowired
    private HousingService service;

    @GetMapping
    public ResponseEntity<List<HousingDTO>> getAllHousings() {
        List<HousingDTO> housings = service.findAllHousings();
        return new ResponseEntity<>(housings, HttpStatus.OK);
    }

    @GetMapping("/{id}")
    public ResponseEntity<Optional<HousingDTO>> getHousingById (Long id) {
        Optional<HousingDTO> housingDto = service.findHousingById(id);
        return new ResponseEntity<>(housingDto, HttpStatus.OK);
    }

    @PostMapping
    public ResponseEntity<HousingDTO> createHousing (@RequestBody HousingDTO housingDto) {
        housingDto = service.addHousing(housingDto);
        return new ResponseEntity<>(housingDto, HttpStatus.CREATED);
    }

    @DeleteMapping("/{id}")
    public ResponseEntity<?> destroyHousing (@PathVariable Long id) {
        service.removeHousing(id);
        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
    }

    @PutMapping("/{id}")
    public ResponseEntity<HousingDTO> refreshHousing (@PathVariable Long id, @RequestBody HousingDTO housingDto) {
        housingDto = service.updateHousing(id, housingDto);
        return new ResponseEntity<>(housingDto, HttpStatus.OK);
    }


}

The error I am getting occurs when trying to fetch all housings with Postman

Hibernate: select h1_0.id,h1_0.address,h1_0.capacity,h1_0.category_id,h1_0.daily_cost,h1_0.description,h1_0.name,h1_0.rating,h1_0.title from housing h1_0
Hibernate: select c1_0.id,c1_0.name from category c1_0 where c1_0.id=?
2023-08-22T17:46:00.165+01:00 ERROR 19948 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.orm.jpa.JpaSystemException: Could not set value of type [org.hibernate.collection.spi.PersistentSet] : `br.com.bookinghubgodoynetworks.api.model.Housing.bookings` (setter)] with root cause

java.lang.IllegalArgumentException: Can not set java.util.HashSet field br.com.bookinghubgodoynetworks.api.model.Housing.bookings to org.hibernate.collection.spi.PersistentSet
    at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167) ~[na:na]
    at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171) ~[na:na]
    at java.base/jdk.internal.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81) ~[na:na]
    at java.base/java.lang.reflect.Field.set(Field.java:799) ~[na:na]
    at org.hibernate.property.access.spi.SetterFieldImpl.set(SetterFieldImpl.java:55) ~[hibernate-core-6.2.5.Final.jar:6.2.5.Final]
    at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:4187) ~[hibernate-core-6.2.5.Final.jar:6.2.5.Final]
    at org.hibernate.sql.results.graph.entity.AbstractEntityInitializer.initializeEntityInstance(AbstractEntityInitializer.java:844) ~[hibernate-core-6.2.5.Final.jar:6.2.5.Final]
    at org.hibernate.sql.results.graph.entity.AbstractEntityInitializer.initializeEntity(AbstractEntityInitializer.java:804) ~[hibernate-core-6.2.5.Final.jar:6.2.5.Final]
    at org.hibernate.sql.results.graph.entity.AbstractEntityInitializer.initializeInstance(AbstractEntityInitializer.java:790) ~[hibernate-core-6.2.5.Final.jar:6.2.5.Final]
    at org.hibernate.sql.results.internal.InitializersList.initializeInstance(InitializersList.java:70) ~[hibernate-core-6.2.5.Final.jar:6.2.5.Final]
    at org.hibernate.sql.results.internal.StandardRowReader.coordinateInitializers(StandardRowReader.java:111) ~[hibernate-core-6.2.5.Final.jar:6.2.5.Final]
    at org.hibernate.sql.results.internal.StandardRowReader.readRow(StandardRowReader.java:87) ~[hibernate-core-6.2.5.Final.jar:6.2.5.Final]
    at org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:199) ~[hibernate-core-6.2.5.Final.jar:6.2.5.Final]
    at org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:33) ~[hibernate-core-6.2.5.Final.jar:6.2.5.Final]
    at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.doExecuteQuery(JdbcSelectExecutorStandardImpl.java:361) ~[hibernate-core-6.2.5.Final.jar:6.2.5.Final]
    at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.executeQuery(JdbcSelectExecutorStandardImpl.java:168) ~[hibernate-core-6.2.5.Final.jar:6.2.5.Final]
    at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.list(JdbcSelectExecutorStandardImpl.java:93) ~[hibernate-core-6.2.5.Final.jar:6.2.5.Final]
    at org.hibernate.sql.exec.spi.JdbcSelectExecutor.list(JdbcSelectExecutor.java:31) ~[hibernate-core-6.2.5.Final.jar:6.2.5.Final]
    at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.lambda$new$0(ConcreteSqmSelectQueryPlan.java:110) ~[hibernate-core-6.2.5.Final.jar:6.2.5.Final]
    at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.withCacheableSqmInterpretation(ConcreteSqmSelectQueryPlan.java:303) ~[hibernate-core-6.2.5.Final.jar:6.2.5.Final]
    at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.performList(ConcreteSqmSelectQueryPlan.java:244) ~[hibernate-core-6.2.5.Final.jar:6.2.5.Final]
    at org.hibernate.query.sqm.internal.QuerySqmImpl.doList(QuerySqmImpl.java:518) ~[hibernate-core-6.2.5.Final.jar:6.2.5.Final]
    at org.hibernate.query.spi.AbstractSelectionQuery.list(AbstractSelectionQuery.java:367) ~[hibernate-core-6.2.5.Final.jar:6.2.5.Final]
    at org.hibernate.query.Query.getResultList(Query.java:119) ~[hibernate-core-6.2.5.Final.jar:6.2.5.Final]
    at org.springframework.data.jpa.repository.support.SimpleJpaRepository.findAll(SimpleJpaRepository.java:382) ~[spring-data-jpa-3.1.1.jar:3.1.1]
    at org.springframework.data.jpa.repository.support.SimpleJpaRepository.findAll(SimpleJpaRepository.java:95) ~[spring-data-jpa-3.1.1.jar:3.1.1]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
    at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:288) ~[spring-data-commons-3.1.1.jar:3.1.1]
    at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:136) ~[spring-data-commons-3.1.1.jar:3.1.1]
    at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:120) ~[spring-data-commons-3.1.1.jar:3.1.1]
    at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:516) ~[spring-data-commons-3.1.1.jar:3.1.1]
    at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:285) ~[spring-data-commons-3.1.1.jar:3.1.1]
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:628) ~[spring-data-commons-3.1.1.jar:3.1.1]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.0.10.jar:6.0.10]
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:168) ~[spring-data-commons-3.1.1.jar:3.1.1]
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:143) ~[spring-data-commons-3.1.1.jar:3.1.1]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.0.10.jar:6.0.10]
    at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:72) ~[spring-data-commons-3.1.1.jar:3.1.1]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.0.10.jar:6.0.10]
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) ~[spring-tx-6.0.10.jar:6.0.10]
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:391) ~[spring-tx-6.0.10.jar:6.0.10]
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-6.0.10.jar:6.0.10]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.0.10.jar:6.0.10]
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) ~[spring-tx-6.0.10.jar:6.0.10]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.0.10.jar:6.0.10]
    at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:164) ~[spring-data-jpa-3.1.1.jar:3.1.1]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.0.10.jar:6.0.10]
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-6.0.10.jar:6.0.10]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.0.10.jar:6.0.10]
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:244) ~[spring-aop-6.0.10.jar:6.0.10]
    at jdk.proxy4/jdk.proxy4.$Proxy122.findAll(Unknown Source) ~[na:na]
    at br.com.bookinghubgodoynetworks.api.service.HousingService.findAllHousings(HousingService.java:28) ~[classes/:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) ~[spring-aop-6.0.10.jar:6.0.10]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) ~[spring-aop-6.0.10.jar:6.0.10]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-6.0.10.jar:6.0.10]
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:756) ~[spring-aop-6.0.10.jar:6.0.10]
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) ~[spring-tx-6.0.10.jar:6.0.10]
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:391) ~[spring-tx-6.0.10.jar:6.0.10]
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-6.0.10.jar:6.0.10]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.0.10.jar:6.0.10]
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:756) ~[spring-aop-6.0.10.jar:6.0.10]
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) ~[spring-aop-6.0.10.jar:6.0.10]
    at br.com.bookinghubgodoynetworks.api.service.HousingService$$SpringCGLIB$$0.findAllHousings(<generated>) ~[classes/:na]
    at br.com.bookinghubgodoynetworks.api.controller.HousingController.getAllHousings(HousingController.java:24) ~[classes/:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:207) ~[spring-web-6.0.10.jar:6.0.10]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:152) ~[spring-web-6.0.10.jar:6.0.10]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.0.10.jar:6.0.10]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:884) ~[spring-webmvc-6.0.10.jar:6.0.10]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797) ~[spring-webmvc-6.0.10.jar:6.0.10]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.0.10.jar:6.0.10]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1081) ~[spring-webmvc-6.0.10.jar:6.0.10]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:974) ~[spring-webmvc-6.0.10.jar:6.0.10]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1011) ~[spring-webmvc-6.0.10.jar:6.0.10]
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) ~[spring-webmvc-6.0.10.jar:6.0.10]
    at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) ~[tomcat-embed-core-10.1.10.jar:6.0]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.0.10.jar:6.0.10]
    at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.10.jar:6.0]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:205) ~[tomcat-embed-core-10.1.10.jar:10.1.10]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.10.jar:10.1.10]
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-10.1.10.jar:10.1.10]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.10.jar:10.1.10]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.10.jar:10.1.10]
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.0.10.jar:6.0.10]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.10.jar:6.0.10]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.10.jar:10.1.10]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.10.jar:10.1.10]
    at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.0.10.jar:6.0.10]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.10.jar:6.0.10]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.10.jar:10.1.10]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.10.jar:10.1.10]
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.0.10.jar:6.0.10]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.10.jar:6.0.10]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.10.jar:10.1.10]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.10.jar:10.1.10]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:166) ~[tomcat-embed-core-10.1.10.jar:10.1.10]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-10.1.10.jar:10.1.10]
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482) ~[tomcat-embed-core-10.1.10.jar:10.1.10]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[tomcat-embed-core-10.1.10.jar:10.1.10]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-10.1.10.jar:10.1.10]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-10.1.10.jar:10.1.10]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341) ~[tomcat-embed-core-10.1.10.jar:10.1.10]
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391) ~[tomcat-
...........

I don't know what to do, I am guessing that it might be due to the modelmapper(?)

1 Answers1

3

Program to an interface, not an implementation.

In other words, change the type of the field in your entity (and also in your DTO) to the interface Set<Booking> instead of the specific implementation type HashSet<Booking>:

@OneToMany
private Set<Booking> bookings = new HashSet<>();
Basil Bourque
  • 303,325
  • 100
  • 852
  • 1,154
Jesper
  • 202,709
  • 46
  • 318
  • 350