Spring Boot: java.lang.StackOverflowError

Viewed 39

Assume that I have two entities:

Hotel (Parent) --> User (Child)

Every row in table user_master have several child rows which is related to the hotel_master.

I want to delete specific rows in Hotel which means I have to delete the related rows in User first. While I'm trying to delete Hotel, I get error because I have to delete data in User first.

Here down is my code:

Entity

public class Hotel {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer hotelId;
    private String hotelName;
    private String city;

    @JsonManagedReference
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "hotel")
    private Set<User> users;

}

public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer userId;
    private String userName;
    private String email;
    private String password;

    @JsonBackReference
    @ManyToOne(targetEntity = Hotel.class)
    @JoinColumn(name = "hotelId")
    private Hotel hotel;

}

ServiceImpl

@Override
public void deleteHotel(Integer hotelId) {
    Hotel hotel = hotelRepo.findById(hotelId).get();
    for (User user : hotel.getUsers()) {
        userRepo.deleteById(user.getUserId());
    }
    hotelRepo.delete(hotel);
}

Controller

@RequestMapping(value = "/{hotelId}", method = RequestMethod.DELETE)
public void deleteHotel(@PathVariable("hotelId") Integer hotelId) {
    hotelService.deleteHotel(hotelId);
}

Error

java.lang.StackOverflowError
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:916)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeQuery(ClientPreparedStatement.java:972)
    at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52)
    at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:57)
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.getResultSet(AbstractLoadPlanBasedLoader.java:390)
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeQueryStatement(AbstractLoadPlanBasedLoader.java:163)
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:104)
    at org.hibernate.loader.collection.plan.AbstractLoadPlanBasedCollectionInitializer.initialize(AbstractLoadPlanBasedCollectionInitializer.java:87)
    at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:705)
    at org.hibernate.event.internal.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:76)
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:107)
    at org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:2208)
    at org.hibernate.collection.internal.AbstractPersistentCollection$4.doWork(AbstractPersistentCollection.java:595)
    at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:264)
    at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:591)
    at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:149)
0 Answers
Related