2016-05-18 2 views
1

を使用したとき、これは私のデータベースです:オブジェクトでorg.hibernate.exception.ConstraintViolationException @JoinTable

------------  ----------------------  ------------ 
| NEWS |  |  NEWS_IMAGE  |  | IMAGE | 
------------  ----------------------  ------------ 
| id | text|  | id_news | id_image |  | id | URL | 
------------  ----------------------  ------------ 
    |      |  |    | 
    <-<-<-<-<-<- Foreign Key  Foreign Key ->->-> 

ニュース私はオブジェクト画像Listを持っています。ここに私のマッピングシステムである:

@Entity 
@Table(name = "news") 
class News{ 

    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    private long id; 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true) 
    @JoinTable(name = "news_image", 
       joinColumns = { @JoinColumn(name = "id_news")}, 
       inverseJoinColumns = { @JoinColumn(name = "id_image")}) 
       private List<Image> images = new ArrayList<Image>();} 

そして、これはオブジェクト画像です:私がしようとすると、

News news = org.hibernate.SessionFactory.get(News.class, id); 
Image image = news.getImages().get(0); 
org.hibernate.SessionFactory.getCurrentSessionFactory().delete(image); 

:これは私が被写体像を削除する方法です

@Entity 
@Table(name = "image") 
public class Image { 

    @Id 
    @Column(name = "id") 
    @GeneratedValue 
    private long id; 

    @Column(name = "URL") 
    private String URL; 
} 

テーブルから画像を削除画像私はこのエラーが発生します:

Could not execute JDBC batch update; 
SQL [delete from image where id=?]; 
constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: 
Could not execute JDBC batch update. 

私はテーブルにテーブルnews_imageから画像を外部キーを削除すると、すべてが正常に動作します。 Hibernateは、テーブルnews_imageの中のレコードを最初に削除してから、テーブルの画像のレコードを削除することができます。 どうすればよいですか?その外部キーを削除する必要がありますか?マッピング中にエラーが発生したので、そのエラーが発生するのはなぜですか?

ありがとうございます。

+0

画像の削除に問題がありますが、画像エンティティのコードや削除のための呼び出しのコードを投稿できませんでしたか? –

+0

申し訳ありません。オブジェクトImageとそれを削除する方法についていくつかのコードを追加しました。 – MDP

答えて

1

あなたのマッピングが立つと、Imageはそれについて何も知らないようNEWS_IMAGE関連テーブル内の対応するレコードは、Hibernateが削除されませんNewsに関連については何も知りません。この問題を解決するには

あなたは以下のようにコードを更新することができ、次のいずれか

//News is managing the association to Image and has Cascade options defined 
//so we need to update and merge the News instance 
News news = org.hibernate.SessionFactory.get(News.class, id); 
Image image = news.getImages().get(0); 
news.getImages().remove(image); 
org.hibernate.SessionFactory.getCurrentSessionFactory().saveOrUpdate(news); 

それとも、そのイメージが連想知っているので、あなたのマッピングを更新し、前のように進行することができます

ニュース:

@Entity 
@Table(name = "news") 
class News{ 

    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    private long id; 

    @OneToMany(mappedBy = "news", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true) 
    private List<Image> images = new ArrayList<Image>(); 
} 

画像:

@Entity 
@Table(name = "image") 
public class Image { 

    @Id 
    @Column(name = "id") 
    @GeneratedValue 
    private long id; 

    @Column(name = "URL") 
    private String URL; 

    @ManyToOne(cascade = CascadeType.DELETE) 
    @JoinTable(name = "news_image", 
       joinColumns = { @JoinColumn(name = "id_image")}, 
       inverseJoinColumns = { @JoinColumn(name = "id_news")}) 
    private News news; 

} 
+0

ありがとう、あなた。あなたが答えている間、私は私の記事を編集しました。画像の中にマッピング・システムを追加しましたが、あなたはNewsの中に古いマッピング・システムを残しました。それは動作するようです。しかし、両方のニュースで@JoinTableを持っているかどうかは分かりません。クラスとImage.classは私に将来のいくつかの問題につながる可能性があります。 解決策はありがたいです。あなたが過去に私に与えた他のすべてと同じように完璧です:D – MDP

+0

いいえ、相手側のmappedByを使用します。 –

0

まず、結合テーブルから削除してから、子テーブルから削除する必要があります。

delete pc.* from parent_child as pc left join child as c on pc.id_child=c.id where c.id = 1; 
delete from child where child.id = 1; 
+0

本当ですか?なぜ普通のカスケード操作はありませんか? –

+0

投稿者がSQLを使用していると思われるので、JPQLでこれをやろうとはしませんでした。 –

+0

実際に私はカスケード操作を使用する必要があります。私はいくつかのコードを追加しました – MDP

関連する問題