최대 절전 모드 상태로 작동 중입니다. 개체를 삭제하려고하지만 SQL 예외가 발생했습니다.엔티티를 삭제할 때 제약 조건 위반
그래서 일단 내 매핑 :
@Entity
public class Meetup {
@Id
@GeneratedValue
@Column
private long id;
@Column(nullable = false)
private ZonedDateTime dateAndTime;
@ManyToOne(fetch = FetchType.EAGER,cascade=CascadeType.PERSIST)
private Location location;
////////////////////////
@Entity
public class Location {
@Id
@GeneratedValue
@Column
private long id;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private double longitude;
@Column(nullable = false)
private double latitude;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "location")
private List<Meetup> meetups;
/// /////////////////////////////
@Entity
public class Match {
@Id
@GeneratedValue
@Column
private long id;
@ManyToMany(fetch = FetchType.LAZY, cascade=CascadeType.ALL)
private List<User> users = new ArrayList<>();
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name = "meetup_id")
private Meetup meetup;
그래서 나는 ' 내가 meetup 엔티티를 삭제하려고하지만, 그렇게함으로써 나는 대응하는 Location 엔티티를 지우고 싶지 않습니다. 내가
constraint ["FKJRLUYUGNHRKYWSVSRE8VE9I9D: PUBLIC.MATCH FOREIGN KEY(MEETUP_ID) REFERENCES PUBLIC.MEETUP(ID) (1)"; SQL statement: delete from meetup where id=? [23503-192]]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
문제납니다 (entityManager.remove를) 만남 개체를 제거하기 위해 노력하고있어 이제 때하는 캐스케이드 유형을 변경하여 해결할 수 있습니다에 "ALL"만남 클래스의 매핑에,하지만 분명히 내 위치 엔티티도 삭제됩니다. 그리고 이것은 내가 원하지 않는 일입니다. 그렇다면 어떻게 위치 엔티티를 삭제하지 않고 만남 엔티티를 삭제할 수 있습니까? 모델을 감안할 때
// Get your meetup by identifier
final Meetup meetup = entityManager.find(Meetup.class, meetupId);
// cleanup the match associations with meetup
entityManager.createQuery("FROM Match WHERE meetup = :meetup")
.setParameter("meetup", meetup)
.getResultList()
.forEach(match -> { match.setMeetup(null); });
// remove meetup
entityManager.remove(meetup);
에 대한 캐스케이드 작업과 함께 꾸며 낼 필요가 없습니다 :
완전한 예외 텍스트를 덤프하면 다른 사람들이 당신을 더 잘 도와 줄 수 있습니다 .1 –
'Meetup'을 삭제하려면 먼저 그것을 참조하는 모든'Match '엔티티를 삭제해야합니다. 그것은'Meetup'에 역 참조를 추가하고 그것에 대응하는 케스케이드를 추가함으로써 이루어질 수 있습니다. - '위치'는 문제의 일부가 아닙니다. "_PUBLIC.MATCH_ FOREIGN KEY (MEETUP_ID) REFERENCES PUBLIC.MEETUP (ID)". – Thomas
옙 나는 그것을 알아 차렸다. 그러나 그때 나는 match를 삭제해야하고, 나는 ManyToMany 관계로 인해서 다른 테이블에 제약을가한다. 그래서 일치를 삭제해야한다. 그런 다음 match를 삭제해야한다. 그리고 마지막으로 나는 모임을 삭제할 수 있습니다. 내가 만남을 제거하기 위해 전체 데이터베이스를 지워 버렸기 때문에 어느 쪽이 싫은가. 그 때문에 내 디자인이 빨려 있습니까? 두 명의 사용자가 성냥을 가졌지 만 X 위치에서 만남을하기로 결정했지만 그때 그들은 마음이 바뀌어 위치 Y에 가고 싶어했습니다. 그들은 여전히 서로 좋아합니다 (성냥은 머물러 있어야합니다). D – filemonczyk