2016-11-16 10 views
0

2つのオブジェクトエンティティ(UserおよびPhone)があり、多対多リレーションシップを持つことになっています。親行を削除または更新できませんConstraintViolationException

User.java

//all columns 

@ManyToMany(cascade = CascadeType.MERGE, fetch = FetchType.EAGER) 
    @JoinTable(name = "USER_PHONE", 
      joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"), 
      inverseJoinColumns = @JoinColumn(name = "phone_id", referencedColumnName = "id")) 
    private List<Phone> phones; 

//all columns @ManyToMany(cascade = CascadeType.MERGE, fetch = FetchType.EAGER) @JoinTable(name = "USER_PHONE", joinColumns = @JoinColumn(name = "phone_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id")) private List<User> userList; 

Phone.java

は今、私は私のUSERテーブルにIDが1と2との2人のユーザーを追加します。 次に、id 1の電話を1つ追加し、両方のユーザID(1 & 2)にマッピングします。

マイUSER_PHONEテーブルは以下のようになります。私はこれをしようとすると

Select * from USER_PHONE; 
+----------+---------+ 
| phone_id | user_id | 
+----------+---------+ 
|  1 |  1 | 
|  1 |  2 | 
+----------+---------+ 

さて、私はID 2. でユーザーを削除したい、私はエラー

javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`dbname`.`USER_PHONE`, CONSTRAINT `FKC6A847DAFA96A429` FOREIGN KEY (`user_id`) REFERENCES `USER` (`ID`)) 

私を取得しますスクリプトを削除:

String query = "DELETE User where id=?1"; 
     try{ 
      Query q = entityManager.createQuery(query); 
      q.setParameter(1,id); 
      q.executeUpdate(); 
      System.out.println(System.currentTimeMillis() + " DELETE: userId " + id + " ==> deleted"); 
     } catch(Exception e){ 
      e.printStackTrace(); 
      return false; 
     } 

私は間違っていますか? ありがとうございました:)

答えて

1

entityManager.createNativeQuery()を試してください。 createQuery()を使用することはできません。表がJavaコードのエンティティとして存在する必要があるからです。また、正確なSQL形式を使用する必要があります。

String query = "DELETE FROM USER_PHONE WHERE user_id=?1";

try{ 
     Query q = entityManager.createNativeQuery(query); 
     q.setParameter(1,id); 
     q.executeUpdate(); 
     System.out.println(System.currentTimeMillis() + " DELETE User_Phone: userId " + id + " ==> deleted"); 
    } catch(Exception e){ 
     e.printStackTrace(); 
     return false; 
    }` 

まず残念ながら工事を行うこと(createQuery()を使用して)User

+0

ありがとう@ Shubham。それはとてもうまくいった。 –

0

次の変更を行います。

//User class 
@ManyToMany(cascade = {CascadeType.MERGE,CascadeType.REMOVE}, fetch = FetchType.EAGER) 
... 
private List<Phone> phones; 
+0

から次に(createNativeQuery()を使用して)USER_PHONEから行を削除し、。私はまだ同じエラーが発生します。その他のオプションは? –

+0

この変更後にエラーを投稿することはできますか? –

+0

エラー:org.hibernate.exception.ConstraintViolationException:親行を削除または更新できません:外部キー制約が失敗しました( 'dbname'.USER_PHONE'、CONSTRAINT' FKC6A847DAFA96A429')FOREIGN KEY( 'user_id')REFERENCES' USER'( ' ID')) –

関連する問題