Cześć. Posiadam dwie encje, będące ze sobą w relacji OneToMany. Chciałbym usuwając rodzica usuwać także dzieci, jednak SQL ma z tym jakiś problem
java.sql.SQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`pickmeup_database`.`offered_ride`, CONSTRAINT `offered_ride_ibfk_1` FOREIGN KEY (`id_user`) REFERENCES `user` (`id_user`))
Schemat bazy
OfferedRide.class
@Entity
@Table(name="offered_ride")
public class OfferedRide {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id_offered_ride")
@JsonView({View.User.class, View.ActivationCode.class, View.OfferedRide.class, View.Seat.class})
private int id_offered_ride;
@Column(name="date_of_ride")
@JsonView({View.User.class, View.ActivationCode.class, View.OfferedRide.class, View.Seat.class})
private Date date_of_ride;
@Column(name="time_of_ride")
@JsonView({View.User.class, View.ActivationCode.class, View.OfferedRide.class, View.Seat.class})
private Time time_of_ride;
@Column(name="number_of_free_seats")
@JsonView({View.User.class, View.ActivationCode.class, View.OfferedRide.class, View.Seat.class})
private int number_of_free_seats;
@Column(name="ride_category")
@JsonView({View.User.class, View.ActivationCode.class, View.OfferedRide.class, View.Seat.class})
private int ride_category;
@Column(name="from_where")
@JsonView({View.User.class, View.ActivationCode.class, View.OfferedRide.class, View.Seat.class})
private String from_where;
@Column(name="to_where")
@JsonView({View.User.class, View.ActivationCode.class, View.OfferedRide.class, View.Seat.class})
private String to_where;
@Column(name="user_comment")
@JsonView({View.User.class, View.ActivationCode.class, View.OfferedRide.class, View.Seat.class})
private String user_comment;
@ManyToOne(cascade= {CascadeType.PERSIST, CascadeType.MERGE,
CascadeType.DETACH, CascadeType.REFRESH})
@JoinColumn(name="id_user")
@JsonView({View.OfferedRide.class, View.Seat.class})
private User user;
@OneToMany(mappedBy="offeredRide",
cascade= {CascadeType.ALL})
@JsonView({View.User.class})
private List<Seat> listOfSeats;
public OfferedRide() {
}
User.class
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_user")
@JsonView({View.ActivationCode.class, View.User.class, View.OfferedRide.class, View.Seat.class})
private int id_user;
@OneToOne(cascade = {CascadeType.DETACH,
CascadeType.MERGE,
CascadeType.PERSIST,
CascadeType.REFRESH})
@JoinColumn(name = "id_activation_code")
@JsonView({View.User.class})
private ActivationCode activationCode;
@Column(name = "user_name")
@JsonView({View.ActivationCode.class, View.User.class, View.OfferedRide.class, View.Seat.class})
private String user_name;
@Column(name = "user_surname")
@JsonView({View.ActivationCode.class, View.User.class, View.OfferedRide.class, View.Seat.class})
private String user_surname;
@Column(name = "user_email")
@JsonView({View.ActivationCode.class, View.User.class, View.OfferedRide.class, View.Seat.class})
private String user_email;
@Column(name = "user_password")
@JsonView({View.ActivationCode.class, View.User.class})
private String user_password;
@Column(name = "user_phone_number")
@JsonView({View.ActivationCode.class, View.User.class, View.OfferedRide.class, View.Seat.class})
private String user_phone_number;
@Column(name = "user_car")
@JsonView({View.ActivationCode.class, View.User.class, View.OfferedRide.class, View.Seat.class})
private String user_car;
@Column(name = "user_description")
@JsonView({View.ActivationCode.class, View.User.class, View.OfferedRide.class, View.Seat.class})
private String user_description;
@Column(name = "is_active")
@JsonView({View.ActivationCode.class, View.User.class})
private boolean is_active;
@OneToMany(mappedBy="user",
cascade= {CascadeType.ALL})
@JsonView({View.User.class})
private List<OfferedRide> listOfUsersOfferedRides;
@OneToMany(mappedBy="user",
cascade= {CascadeType.ALL})
@JsonView({View.User.class})
private List<Seat> listOfUserSeats;
public User() {
}
Metoda usuwająca
@Override
public Response deleteUserById(int theID) {
Session session = entityManager.unwrap(Session.class);
Response response = new Response();
User user;
try {
user = session.get(User.class, theID);
} catch (NoResultException ex) {
response.setMsg("User with ID " + theID + " not found");
response.setSuccesful(false);
return response;
}
if(user != null){
Query query = session.createQuery("DELETE FROM User user WHERE user.id_user = " + theID);
query.executeUpdate();
response.setSuccesful(true);
response.setMsg("User with ID " + theID + " successfully deleted");
} else {
response.setMsg("User with ID " + theID + " not found");
response.setSuccesful(false);
}
return response;
}
Próbowałem wielu rozwiązań, stackoverflow itp, ale nic nie działa. Cały czas SQL pluje się, że probuje usunąć obiekt który jest kluczem obcym innego obiektu, mimo, że zaznaczone jest wyraźnie CascadeType.ALL
Czy ktoś może ma jakiś pomysł ?