2012-01-01 3 views
0

사용자 및 이벤트의 두 엔티티가 있습니다. 각 사용자는주의를 기울이는 이벤트 목록을 가지고 있습니다.JPA : ManyToMany 관계의 제한

@Entity 
@Table(name = "user") 
public class User { 
    @Id 
    @Column(name = "login", length = 64) 
    protected String login; 

    @ManyToMany 
    @LazyCollection(LazyCollectionOption.FALSE) 
    @JoinTable(name = "user_events", 
     joinColumns = {@JoinColumn(name = "login") }, 
     inverseJoinColumns = {@JoinColumn(name = "event_id") }) 
    protected List<Event> events; 
} 

@Entity 
@Table(name = "events") 
public class Event extends BaseEntity { 
    @Id 
    @Column(name = "event_id") 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    protected Long eventId; 
} 

하지만 사용자가 일정에주의를 기울이면 해당 이벤트를 데이터베이스에서 삭제할 수 없습니다. JPA에서 설정 한 제한 사항이있는 것으로 보입니다. 아무도 그 문제를 해결할 수있는 방법을 말해 줄 수 있습니까? 미리 감사드립니다.

답변

2

제한 사항은 JPA에서 설정하지 않습니다. 데이터베이스에 있습니다 : event_id 조인 테이블의 조인 열은 이벤트 ID에 대한 외래 키입니다. 일부 사용자가 계속 참조하고 있기 때문에 이벤트를 제거 할 수 없습니다.

이벤트를 삭제하고 사용자의 모든 참조를 이벤트로 삭제하려면 이벤트를 참조하는 모든 사용자를 검색하고 해당 목록에서 이벤트를 제거한 다음 이벤트를 삭제해야합니다.

String jpql = "select u from User u inner join u.events e where e.id = :eventId; 
// execute the query 
for (User u : users) { 
    u.removeEvent(eventToDelete); 
} 
em.remove(eventToDelete); 
+0

감사합니다.이 작업을 수행하는 유일한 방법입니까? 주석을 추가하여 이벤트를 삭제할 때 해당 이벤트에 대한 사용자의 모든 참조가 삭제되도록 할 수 있습니까? – John

+0

네이티브 SQL을 사용하는 것 외에는 이것이 유일한 방법이라고 생각합니다. –

+0

확인. 당신의 도움을 주셔서 감사합니다. – John

관련 문제