2016-10-06 3 views
0

최대 절전 모드 상태로 작동 중입니다. 개체를 삭제하려고하지만 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); 

에 대한 캐스케이드 작업과 함께 꾸며 낼 필요가 없습니다 :

+0

완전한 예외 텍스트를 덤프하면 다른 사람들이 당신을 더 잘 도와 줄 수 있습니다 .1 –

+0

'Meetup'을 삭제하려면 먼저 그것을 참조하는 모든'Match '엔티티를 삭제해야합니다. 그것은'Meetup'에 역 참조를 추가하고 그것에 대응하는 케스케이드를 추가함으로써 이루어질 수 있습니다. - '위치'는 문제의 일부가 아닙니다. "_PUBLIC.MATCH_ FOREIGN KEY (MEETUP_ID) REFERENCES PUBLIC.MEETUP (ID)". – Thomas

+0

옙 나는 그것을 알아 차렸다. 그러나 그때 나는 match를 삭제해야하고, 나는 ManyToMany 관계로 인해서 다른 테이블에 제약을가한다. 그래서 일치를 삭제해야한다. 그런 다음 match를 삭제해야한다. 그리고 마지막으로 나는 모임을 삭제할 수 있습니다. 내가 만남을 제거하기 위해 전체 데이터베이스를 지워 버렸기 때문에 어느 쪽이 싫은가. 그 때문에 내 디자인이 빨려 있습니까? 두 명의 사용자가 성냥을 가졌지 만 X 위치에서 만남을하기로 결정했지만 그때 그들은 마음이 바뀌어 위치 Y에 가고 싶어했습니다. 그들은 여전히 ​​서로 좋아합니다 (성냥은 머물러 있어야합니다). D – filemonczyk

답변

1

당신은 단순히해야 할 모든 트랜잭션의 경계 내에서 다음과 같이 당신이 MeetUp의 제거를 처리 확인한다 이 유스 케이스.

+0

그래서 당신의 말은 없습니다. 캐스케이드 연산을 사용해야합니까? 나는 매번 추천되기 때문에 적은 노력으로 최신 데이터베이스를 가질 수있다. – filemonczyk

관련 문제