2012-01-01 14 views
0

私は2つのエンティティ、UserとEventを持っています。各ユーザーには、注意を払うイベントのリストがあります。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

関連する問題