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)